这些指针之间的区别
Difference between these pointers
我写了这个 C 代码
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
int *P[3] = A;
这给出了一个错误。但是当我像这样修改指针时
int (*P)[3] = A;
代码编译。这两个指针有什么区别
这个声明
int *P[3]
没有声明指针。它声明了一个包含三个 int *
.
类型元素的数组
您甚至可以按以下方式重写此数组声明
int * ( P[3] )
但是,您不能用另一个数组初始化一个数组,即使是相同类型的数组,除非您可以用字符串文字初始化字符数组。
这个声明
int (*P)[3]
确实声明了一个指向数组类型对象的指针int[3]
。另一方面,此声明中使用的初始值设定项
int (*P)[3] = A;
类型为 int[2][3]
的对象被隐式转换为指向类型 int ( * )[3]
的第一个元素(即数组 {1, 2, 3}
)的指针。所以声明的对象和初始化表达式具有相同的类型 int ( * )[3]
.
我写了这个 C 代码
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
int *P[3] = A;
这给出了一个错误。但是当我像这样修改指针时
int (*P)[3] = A;
代码编译。这两个指针有什么区别
这个声明
int *P[3]
没有声明指针。它声明了一个包含三个 int *
.
您甚至可以按以下方式重写此数组声明
int * ( P[3] )
但是,您不能用另一个数组初始化一个数组,即使是相同类型的数组,除非您可以用字符串文字初始化字符数组。
这个声明
int (*P)[3]
确实声明了一个指向数组类型对象的指针int[3]
。另一方面,此声明中使用的初始值设定项
int (*P)[3] = A;
类型为 int[2][3]
的对象被隐式转换为指向类型 int ( * )[3]
的第一个元素(即数组 {1, 2, 3}
)的指针。所以声明的对象和初始化表达式具有相同的类型 int ( * )[3]
.