C 语言指针从入门到避坑:把指针踩在脚底(3)
数组名的理解数组名在一般情况下是数组首元素的地址不过两种特殊情况sizeof(数组名此时数组名代表的是整个数组而此时sizeof的结果是数组的大小字节数组名此时数组名也代表整个数组此时的结果是整个数组的地址虽然打印的结果相同但数组首元素的地址 数组的地址具体体现在arr1和arr1的不同。使用指针访问数组当我们使用指针打印数组时通常采用以下写法intmain(){inti0;intarr[10]{1,2,3,4,5,6,7,8,9,10};int*parr;for(i0;i10;i){printf(%d\n,*(pi);结合以前的写法我们可知arr[i]*(arri)*(pi)所以可以看出通过下标访问数组的本质就是通过指针访问数组。结合加法交换律*(arri)*(iarr)。而[]和加号都是操作符。结合上述特性可以推算出arr[i]i[arr]只不过前者的写法便于人理解。一维数组传参的本质一维数组传参本质传的是数组的第一个元素的地址。所以在传入数组时函数的形参有两种写法。//创建一个数组intmain(){intarr[10]{0};test(arr);}voidtest(int*arr);//这是直接接受了数组的第一个元素的地址voidtest(intarr[10]);//这种写法也可以便于理解此外因为传入的是数组第一个元素的地址所以函数内部不能计算数组的个数如果函数内部要用到数组个数的话要额外传入。intmain(){intarr[10]{0};intszsizeof(arr)/sizeof(arr[]);test(arr,sz);}voidtest(int*arr,intsz);在传入数组前数组还是数组在传入后数组变成指针了这种现象叫做数组降级二级指针intmain(){inta0;int*pa;//一级指针变量int**ppp;//二级指针变量对二级指针变量int** pp的理解int**其中int*表示指针变量所指对象是int*类型的*表示pp是一个指针变量二级指针变量的解引用inta5;int*pa;int**ppp;//其中*ppp;而*pa所以**ppa指针数组的理解指针数组是指针还是数组类比intarr[5]{0};//整型数组——用来存放整型数据的数组chararr[5]{0};//字符数组——用来存放字符数据的数组//类比上述数组int*arr[5]{0};//指针数组——用来存放指针数据的数组我们还可以通过更生动的图像来理解指针数组模拟二维数组二维数组是一维数组“拼接”成的二维数组的每一行都可以看成一维数组。在这层理解下我们可以用指针来模拟二维数组。intmain(){intarr1[5]{12345};intarr2[5]{12345};intarr3[5]{12345};int*parr[3]{arr1,arr2,arr3};//数组名是数组中首元素的地址inti0;intj0;for(i0;i3;i){for(j0;j5;j){printf(%d,parr[i][j]);//每一个一维数组中元素地址是连续存放的}}return0;}图解这里我们模拟出了二维指针的效果但是行间并不连续所以这并不是真正的二维指针。目录数组名的理解使用指针访问数组一维数组传参的本质二级指针二级指针变量的解引用指针数组的理解指针数组模拟二维数组