目录
1.数组名的理解
当我们刚开始学习指针时学过用指针访问数组,有这样一段代码:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = &arr[0];
此时p中放的就是数组中首元素的地址,其实数组名就是数组首元素的地址,但是有两个例外:
1:sizeof(数组名)
2:&(数组名)
上面两种形式的数组名都表示整个数组,此外的数组名都表示数组首元素的地址。
那如何验证呢?如图:
此时上面三种情况的输出结果完全相同,那为什么说&arr取的是整个数组的地址跟其他的不一样呢?我们不妨将其都+1后移一位试一下:
如上图,我们发现直接&arr+1后移了40个字节,而不同于其他情况的4字节,这就是因为&arr中的数组名arr是表示整个数组的地址的。
2.使用指针访问数组
一个式子: *(arr + i) <==>(等价于) arr[i] <==> *[i + arr] <==> i[arr]
能够使用指针访问数组的原因:数组在内存中是连续存放的
指针的元素可以很方便的遍历数组,取出数组内值
3.一维数组传参的本质
数组传参的本质:传递的是数组首元素的地址,所以形参即使写成数组的形式,本质上也是一个指针变量。
数组传参时:
形参可以写成数组
,
也可以写成指针
写成数组的形式最简单,在我们初学数组和函数时这样写可以方便我们理解,但是即使写成数组的形式,本质上还是指针。
4.二级指针
我们之前讲过,指针用来存放地址,但指针也是变量,变量就有地址,因此指针也有地址,那指针的地址是什么呢?由此我们引出了二级指针👇
我们先来看看二级指针的形式:
由此可知,二级指针变量是用来存放一级指针变量的地址的。
5.指针数组
存放指针的数组,每个元素其实是指针类型。
我们可以进行类比:
整型数组表示存放整型的数组
字符数组表示存放字符的数组
......
指针数组就表示存放指针的数组。
6.指针数组模拟二维数组
如图,可以通过指针数组模拟出二维数组的效果,但并非完全是二维数组,因为每一行并非是连续的。