#include
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int* p1 = &arr1;
int arr2[5]={ 0 };
int *p2[5] = &arr2;
int arr3[5]={ 0 };
int (*p3)[5] = &arr3;
int arr4[5]={ 0 };
int* (*p4)[5] = &arr4;
return 0;
}
上方代码运行是否有错误?写的内容是否规范呢?
逐条分析:
int arr1[5] = { 1,2,3,4,5 };定义了一个名为arr1的数组,其类型为int[5]
int* p1 = &arr1;&arr1的类型在int[5]的基础上加个*,即int(*)[5]
这里int[5]与int(*)[5]类型不匹配
因此编译器会报警告:
必须强制让*与p1结合,建议改成:
int (*p1)[5] = &arr1;//p1是int(*)[5],(*)代表p1是指针,int[5]代表含五个整型元素的数组
int arr2[5] = { 1,2,3,4,5 };定义了一个名为arr2的数组,其类型为int[5]
int *p2[5] = &arr2;出现了严重的问题!!
报错:
编译器认为p2是数组其包含5个元素(p2[5]),数组的类型为int*
&arr2的类型为int(*)[5]
这里int*与int(*)[5]类型不匹配
必须强制让*与p2结合,建议改成:
int (*p2)[5] = &arr2;//p2是int(*)[5],指向含五个整型元素的数组
int arr3[5]={ 0 };与int (*p3)[5] = &arr3;写法无误,解释同上
int arr4[5] = { 0 };定义了一个名为arr4的数组,其类型为int[5]
int* (*p4)[5] = &arr4;但p4类型有问题
arr4类型为int[5]
&arr4类型为int(*)[5]
但p4类型为int* (*)[5],从int(*)[5]推过来意思是p4是指向含5个int*类型指针元素的数组的指针
所以int(*)[5]与int* (*)[5]类型不匹配
因此编译器会报警告:
建议改成:
int* arr4[5] = { 0 };
int* (*p4)[5] = &arr4;