📅  最后修改于: 2023-12-03 15:15:50.993000             🧑  作者: Mango
在 C 语言中,这两种声明方式都是数组指针的声明方式,但它们之间存在本质的区别。
int(* p)[3] 表示 p 是一个指向长度为 3 的 int 数组的指针。其中,要注意括号的使用,它强制指针先和数组结合起来,再和 int 类型结合起来。
以下是一个 int(* p)[3] 的示例:
int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int(* p)[3] = arr;
printf("%d\n", (*p)[0]); // 输出 1
可以看到,我们通过指针 p 访问到的是整个数组中的第一个元素,而不仅仅是第一行。
int * p [3] 表示 p 是一个包含三个指向 int 类型数据的指针的数组。其中,括号可以省略,即与 int *p[3] 等价。
以下是一个 int * p [3] 的示例:
int a = 1, b = 2, c = 3;
int *p[3] = {&a, &b, &c};
printf("%d\n", *p[0]); // 输出 1
可以看到,我们通过指针数组 p 访问到的是 a 的值,而不是整个数组的某个元素。
综上所述,int(* p)[3] 表示指向一个长度为 3 的 int 数组的指针,而 int * p [3] 表示包含三个指向 int 类型数据的指针的数组。在使用时,我们应该根据实际需求进行选择。