MST
星途 面试题库

面试题:C语言指针数组与数组指针的区别

请详细阐述C语言中指针数组和数组指针的定义、区别,并分别举例说明它们在实际编程中的应用场景。
48.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

指针数组

  1. 定义:指针数组是一个数组,数组的每个元素都是指针类型。其定义形式为 数据类型 *数组名[数组大小]; 例如 int *ptr_array[5];,这里定义了一个名为 ptr_array 的指针数组,它有5个元素,每个元素都是指向 int 类型的指针。
  2. 实际应用场景
    • 字符串管理:常用于管理一组字符串。例如:
#include <stdio.h>
int main() {
    char *strs[] = {"apple", "banana", "cherry"};
    for (int i = 0; i < 3; i++) {
        printf("%s\n", strs[i]);
    }
    return 0;
}

在这个例子中,strs 是一个指针数组,每个元素指向一个字符串常量。这样可以方便地对多个字符串进行操作,如排序、查找等。 - 函数指针数组:可以用于实现函数表。例如:

#include <stdio.h>
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
    int (*func_ptr_array[])(int, int) = {add, subtract};
    int result1 = func_ptr_array[0](3, 2);
    int result2 = func_ptr_array[1](3, 2);
    printf("Add result: %d\n", result1);
    printf("Subtract result: %d\n", result2);
    return 0;
}

这里 func_ptr_array 是一个函数指针数组,每个元素指向一个函数,通过数组索引可以方便地调用不同的函数。

数组指针

  1. 定义:数组指针是一个指针,它指向一个数组。其定义形式为 数据类型 (*指针名)[数组大小]; 例如 int (*ptr)[5];,这里 ptr 是一个指向包含5个 int 类型元素的数组的指针。
  2. 实际应用场景
    • 二维数组操作:在处理二维数组时非常有用。例如:
#include <stdio.h>
int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int (*ptr)[4] = arr;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", *(*(ptr + i) + j));
        }
        printf("\n");
    }
    return 0;
}

这里 ptr 是一个数组指针,指向二维数组 arr 的第一行。通过这种方式可以更方便地对二维数组进行遍历和操作。 - 传递二维数组给函数:在函数参数传递中,当需要传递二维数组时,可以使用数组指针作为参数。例如:

#include <stdio.h>
void print_array(int (*ptr)[4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", *(*(ptr + i) + j));
        }
        printf("\n");
    }
}
int main() {
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    print_array(arr, 3);
    return 0;
}

print_array 函数中,使用数组指针 ptr 来接收二维数组,使得函数能够正确处理二维数组的数据。

区别

  1. 本质:指针数组本质是数组,数组元素为指针;数组指针本质是指针,指向一个数组。
  2. 定义形式:指针数组是 数据类型 *数组名[数组大小];,数组指针是 数据类型 (*指针名)[数组大小];,注意括号的位置不同。
  3. 运算:指针数组名代表整个数组的起始地址,数组名 + 1 移动的是一个指针类型的大小(通常是4或8字节,取决于系统);数组指针名代表指向的数组的起始地址,指针名 + 1 移动的是所指向数组的大小,比如指向 int [5] 的指针,指针 + 1 移动的是 5 * sizeof(int) 字节。