数组名的理解
在我们使用&arr[0]
的方式拿到了数组第一个元素的地址,但是其实,数组名本来就地址,而且是数组首元素的地址
所以数组名就是数组首元素的地址
但是会有两个例外
- sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址
除此之外,任何地方使用数组名,数组名都表示首元素的地址
int arr[10]={1,2,3,4,5,6,7}
arr+1t跳过的就是4个字节,&arr+1跳过的就是40个字节,因为&arr取地址取的是整个数组的地址
使用指针访问数组
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz;i++)
{
printf("%d", arr[i]);
}
return 0;
}
在此代码中,arr
和p
是等价的,那么arr[i]
可以访问元素,那么p[i]
是否也可以访问数组呢?
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6 };
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d", p[i]);
}
return 0;
}
事实证明p[i]
可以替代arr[i]
其实p[i]
可以等价为*(p+i)
可以解释为,首元素的地址+偏移量求出元素的地址,然后解引用来访问
一维数组传参的本质
当我们把数组传递过去的时候,传递的是数组名
void aaa(int arr[])
{
.......
}
int main()
{
......
int arr[]={1,2,3,4,5,6,7,8,9};
aaa(arr);
return 0;
}
这时我们给函数传递的是arr这个数组名,我们知道数组名就是数组首元素的地址,所以本质上数组传参就是数组首元素的地址
既然是地址,那么当然可以用指针变量接收它,所以函数的形参的那一部分当然可以用指针变量代替
二级指针
指针变量也是变量,也有地址,那么指针变量的地址储存在哪里呢?
就是二级指针
int main()
{
int a = 0;
int * aa = &a;
int ** aaa = &aa;//这就是二级指针
return 0;
}
在式子中,*aaa=&aa
,aaa
里储存的是指针变量aa的地址
指针数组
整型数组就是很多整型存放到数组里,字符数组就是很多字符存放到数组里
以此类推,指针数组就是指针存放到数组里
指针数组的每一个元素都是地址,地址又可以指向一个区域
指针数组模拟二维数组
之前有提到过,指针数组就是把指针存放到数组里,指针又能指向一个区域
那么我们可不可以把数组存放到指针里,然后再把指针存放到指针数组
差不多长这样
int main()
{
int arr1[9] = {1,2,3,4,5,6,7,8,9};
int arr2[9] = {1,2,3,4,5,6,7,8,9};
int * parr[2]={arr1,arr2};
return 0 ;
}
parr[i]就是访问parr数组的元素,通过parr[i]找到一维数组后,parr[i][j]就是一维数组中的元素,这样,一个二维数组的效果就做好啦
今天的知识讲解完啦,如果觉得有用可以点一下赞和关注,也可以先收藏以防需要时找不到哦,当然如果作者写的哪里有问题欢迎指出,我们一起进步!!!
祝看到这里的人天天开心哦(笔芯)