一、数组名的理解
1.数组名的理解
通过前面指针1的学习我们知道数组名是数组首元素的地址。
而数组的地址和数组首元素的地址都是从首元素地址开始。
我们看到三个代码的运行结果是一样的,所以数组名是数组首元素的地址,但是他们有什么区别呢? 我们可以用一个代码来观察。
其结果与前面一对比发现:前2个各加4个字节,第三个加40个字节,这是因为&arr是数组整个地址,所以加1会跳过40个字节,而&arr[0]和arr是数组首元素的地址, 所以加1会跳过4个字节。
但也有两个例外,并不是所有数组名都是首元素地址:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。
2.&数组名,这里的数组名也表示整个数组,取出的是整个数组的地址。
除此之外,所有的数组名都是数组首元素的地址。
2.指针访问数组
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = &arr[0];//也可写成arr,因为数组名是数组首元素地址
int i = 0;
//输入
for (i = 0; i < sz; i++)
{
scanf("%d", arr+i);//可以写成p+i
}
//输出
for (i = 0; i < sz; i++)
{
printf("%d ",i[arr]);//*(arr+i)==arr[i]==i[arr]
}
return 0;
}
这串代码中输出程序中 ,i[arr]其实等价于i+arr,i+arr == arr+i == arr[i] == *(arr+i) == *(i+arr);
这里通过指针访问数组元素,*(数组名+下标),这种写法与arr[i]等价,数组名是数组首元素地址,对地址+下标数,地址就会跳转到该数字对应的下标元素位置。
二、一维数组传参的本质
我们通过一个代码来观察:
//一维数组传参的本质:数组名是数组首元素的地址,传参穿的是数组名,所以实际上传递的是首元素地址,
//我们知道一个元素有4个字节,所以通过sizeof函数计算后结果为4.
void print(int arr[])//这里也可写成int* arr
{
int sz1 = sizeof(arr) / sizeof(arr[0]);//4/4=1
printf("sz1=%d\n", sz1);//1
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
printf("sz=%d\n", sz);//10
print(arr);
return 0;
}
通过上面的代码我们知道sz1和sz2的结果并不一样,sz1 = 1;sz2 = 10;这是为什么呢?
通过前面的学习我们知道数组名是数组首元素的地址,而又结合sz1=1,我们可以得出:一维数组在传递参数的时候,并不是将整个数组给传递过去,而是将数组名也就是数组首元素的地址传递过去作为参数,所以一维数组传参的本质是传递了数组首元素的地址。
而我们知道地址可以用指针变量来接受,所以int arr[ ]其实就是int* arr;所以以后我们写代码可以将参数的部分写成指针形式,也可以写成数组的形式。
三、二级指针
地址存放在指针变量当中,而指针变量也是变量,那指针变量又可以存放在哪里呢?
所以我们引出二级指针概念,二级指针是用来存放指针变量的,将指针变量的地址存放在二级指针中。
int** ppa = &pa;
四、指针数组
1.指针数组
int *p [10] = {arr1,arr2,arr3};
是存放指针的数组,每个元素都是指针类型。
2.指针数组模拟二维数组
//指针数组模拟二维数组,指针数组的每一个元素都是地址,记住:数组名是数组首元素的地址。
int main()
{
int arr1[5] = { 1,2,3,4,5 };
int arr2[5] = { 2,3,4,5,6 };
int arr3[5] = { 3,4,5,6,7 };
int* parr[3] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", parr[i][j]);
}
printf("\n");
}
return 0;
}
parr[i]访问的是存放在parr数组中的元素(arr1,arr2,arr3这些一维数组),而parr[i][j] 则是访问整型一维数组中的元素。
到这里今天指针二的学习就结束了,相信大家又进步了一些,只要每天进步一点点,积少成多,你一定变得很厉害!