49.【C语言】解释“数组和指针”容易混淆的地方

#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;

你可能感兴趣的:(C语言学习笔记,开发语言,c语言,指针,数组)