天天看點

C語言指針數組類面試題大全

作者:嵌入式講堂

在C語言的面試中,指針數組是一個非常重要的知識點。它不僅是C語言中最基本的資料結構之一,也是面試官經常考察的知識點。在本篇部落格中,我們将為大家整理一些常見的C語言指針數組類面試題,并為大家提供詳細的解答和示例代碼。希望能夠幫助大家在面試中更好地掌握這個知識點。

目錄

  1. 什麼是指針數組?
  2. 如何定義指針數組?
  3. 如何通路指針數組中的元素?
  4. 指針數組和數組指針有什麼差別?
  5. 如何将一個數組作為參數傳遞給函數?
  6. 如何在函數中傳回一個指針數組?
  7. 如何使用指針數組實作字元串的拷貝?
  8. 如何使用指針數組實作字元串的反轉?
  9. 如何使用指針數組實作字元串的比較?
  10. 如何使用指針數組實作字元串的連接配接?
  11. 如何使用指針數組實作字元串的分割?
  12. 如何使用指針數組實作二維數組的通路?
  13. 如何使用指針數組實作動态記憶體配置設定?
  14. 如何使用指針數組實作連結清單結構?
  15. 如何使用指針數組實作樹結構?

1. 什麼是指針數組?

在C語言中,指針數組是由若幹個指針變量組成的數組。每個指針變量都指向一個特定的記憶體位址,可以用來存儲不同類型的資料。指針數組常用于存儲字元串、結構體等複雜類型的資料。

2. 如何定義指針數組?

定義指針數組的文法如下:

int *arr[10];           

這裡定義了一個包含10個指向int類型變量的指針的數組。可以根據需要修改數組大小和指向的資料類型。

3. 如何通路指針數組中的元素?

通路指針數組中的元素可以使用下标操作符[],例如:

int *arr[10];
int a = 10;
arr[0] = &a;
printf("%d", *arr[0]);           

這裡建立了一個包含10個指向int類型變量的指針的數組,并将a的位址賦給了數組的第一個元素。然後通過*arr[0]通路了a的值并輸出。

4. 指針數組和數組指針有什麼差別?

指針數組和數組指針是兩個不同的概念。

指針數組是一個數組,其元素都是指針類型。這意味着,每個數組元素都存儲了一個指向某個資料類型的指針。例如:

int* ptrArray[10];  // 聲明了一個包含10個整型指針的數組           

在上面的例子中,ptrArray是一個包含10個整型指針的數組。

數組指針是一個指針,它指向一個數組。這意味着,該指針存儲了數組的位址,可以用于通路該數組的元素。例如:

int (*ptr)[10];  // 聲明了一個指向包含10個整數的數組的指針           

在上面的例子中,ptr是一個指向包含10個整數的數組的指針。

是以,指針數組和數組指針有以下差別:

  1. 資料類型不同:指針數組的元素是指針類型,而數組指針指向一個數組。
  2. 定義方式不同:指針數組使用方括号 [] 定義,數組指針使用圓括号 () 定義。
  3. 使用方式不同:指針數組可以用于存儲多個指向不同資料類型的指針,而數組指針主要用于通路數組元素。

5. 如何将一個數組作為參數傳遞給函數?

将一個數組作為參數傳遞給函數時,可以使用指針或者數組的方式。例如:

void func(int arr[], int n)
{
    // ...
}

void func(int *arr, int n)
{
    // ...
}           

這裡定義了兩個函數,一個使用數組作為參數,一個使用指針作為參數。在函數内部,可以使用下标操作符[]或指針操作符*來通路數組元素。

6. 如何在函數中傳回一個指針數組?

在函數中傳回一個指針數組時,需要使用靜态數組或動态記憶體配置設定來建立數組。例如:

int *func()
{
    static int arr[10];
    // ...
    return arr;
}

int *func()
{
    int *arr = (int*)malloc(sizeof(int) * 10);
    // ...
    return arr;
}           

這裡定義了兩個函數,一個使用靜态數組建立指針數組,一個使用動态記憶體配置設定建立指針數組。在函數内部,可以使用下标操作符[]或指針操作符*來通路數組元素。

7. 如何使用指針數組實作字元串的拷貝?

使用指針數組實作字元串的拷貝時,可以使用strcpy函數。例如:

char *str1 = "hello";
char *str2 = (char*)malloc(sizeof(char) * strlen(str1) + 1);
strcpy(str2, str1);           

這裡使用了malloc函數動态配置設定了記憶體,然後使用strcpy函數将str1中的字元串拷貝到str2中。

8. 如何使用指針數組實作字元串的反轉?

使用指針數組實作字元串的反轉時,可以使用指針操作符*和下标操作符[]。例如:

char *str = "hello";
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
    char tmp = *(str + i);
    *(str + i) = *(str + len - i - 1);
    *(str + len - i - 1) = tmp;
}           

這裡使用了指針操作符*和下标操作符[]來交換字元串中的字元。

9. 如何使用指針數組實作字元串的比較?

使用指針數組實作字元串的比較時,可以使用strcmp函數。例如:

char *str1 = "hello";
char *str2 = "world";
int res = strcmp(str1, str2);
if (res < 0) {
    printf("str1 < str2");
} else if (res > 0) {
    printf("str1 > str2");
} else {
    printf("str1 == str2");
}           

這裡使用了strcmp函數比較了兩個字元串的大小。

10. 如何使用指針數組實作字元串的連接配接?

使用指針數組實作字元串的連接配接時,可以使用strcat函數。例如:

char *str1 = "hello";
char *str2 = "world";
char *str3 = (char*)malloc(sizeof(char) * (strlen(str1) + strlen(str2) + 1));
strcpy(str3, str1);
strcat(str3, str2);           

這裡使用了malloc函數動态配置設定了記憶體,然後使用strcpy函數将str1中的字元串拷貝到str3中,最後使用strcat函數将str2中的字元串連接配接到str3中。

11. 如何使用指針數組實作字元串的分割?

使用指針數組實作字元串的分割時,可以使用strtok函數。例如:

char str[] = "hello,world";
char *token = strtok(str, ",");
while (token != NULL) {
    printf("%s\n", token);
    token = strtok(NULL, ",");
}           

這裡使用了strtok函數将字元串按照指定的分隔符分割成若幹個子字元串,并依次輸出。

12. 如何使用指針數組實作二維數組的通路?

使用指針數組實作二維數組的通路時,可以使用指針操作符*和下标操作符[]。例如:

int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int **p = (int**)malloc(sizeof(int*) * 3);
for (int i = 0; i < 3; i++) {
    *(p + i) = *(arr + i);
}
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        printf("%d ", *(*(p + i) + j));
    }
    printf("\n");
}           

這裡使用了指針操作符*和下标操作符[]來通路二維數組中的元素。

13. 如何使用指針數組實作動态記憶體配置設定?

使用指針數組實作動态記憶體配置設定時,可以使用malloc函數。例如:

int *arr[10];
for (int i = 0; i < 10; i++) {
    *(arr + i) = (int*)malloc(sizeof(int));
    **(arr + i) = i;
}
for (int i = 0; i < 10; i++) {
    printf("%d ", **(arr + i));
}           

這裡使用了malloc函數動态配置設定了記憶體,并将配置設定的記憶體位址存儲到指針數組中。

14. 如何使用指針數組實作連結清單結構?

使用指針數組實作連結清單結構時,可以使用結構體和指針數組相結合的方式。例如:

typedef struct Node {
    int data;
    int next;
} Node;

Node arr[10];
int head = 0;
int tail = 0;

void add(int data)
{
    arr[tail].data = data;
    arr[tail].next = tail + 1;
    tail++;
}

void print()
{
    int p = head;
    while (p != tail) {
        printf("%d ", arr[p].data);
        p = arr[p].next;
    }
}           

這裡使用了一個結構體Node來表示連結清單的每個節點,然後使用指針數組arr來存儲節點的資訊。head和tail分别表示連結清單的頭和尾,add函數用于向連結清單中添加元素,print函數用于周遊連結清單并輸出。

15. 如何使用指針數組實作樹結構?

使用指針數組實作樹結構時,可以使用結構體和指針數組相結合的方式。例如:

typedef struct Node {
    int data;
    int left;
    int right;
} Node;

Node arr[10];
int root = 0;

void add(int data)
{
    int p = root;
    while (1) {
        if (data < arr[p].data) {
            if (arr[p].left == -1) {
                arr[p].left = tail;
                break;
            } else {
                p = arr[p].left;
            }
        } else {
            if (arr[p].right == -1) {
                arr[p].right = tail;
                break;
            } else {
                p = arr[p].right;
            }
        }
    }
    arr[tail].data = data;
    arr[tail].left = -1;
    arr[tail].right = -1;
    tail++;
}

void print(int p)
{
    if (p == -1) {
        return;
    }
    printf("%d ", arr[p].data);
    print(arr[p].left);
    print(arr[p].right);
}           

這裡使用了一個結構體Node來表示樹的每個節點,然後使用指針數組arr來存儲節點的資訊。root表示樹的根節點,add函數用于向樹中添加元素,print函數用于周遊樹并輸出。

難一點的面試題

請實作一個函數,将一個二維數組按照從小到大的順序排序,并輸出排序後的結果。要求使用指針數組實作。

繼續閱讀