先给大家分享一句我很喜欢我话:
知不足而奋进,望远山而前行!!!
铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!!
今天我们更新了指针进阶的内容,
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
前言:
在上篇博客中,我们对指针和数组的应用有了一些简单的,这次我们将对他们有一个更详细的解释。
一、数组名的理解
什么是数组名?我们平常经常说数组名就是数组首元素的地址,那到底是不是这样呢?
那我们写一串代码是不是这样呢?
int main()
{
int arr[10] = { 0 };
printf("arr =%p\n", arr);
printf("&arr[0] =%p\n", &arr[0]);
return 0;
}
由此可得,两者在数值上是相等的,所以数组名就是数组首元素(第一个元素)的地址
这是侯可能有人会疑问,如果数组名是首元素地址,那么下面这串代码怎么解释:
#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",sizeof(arr));
return 0;
}
这串代码运行结果为40,如果arr指的是首元素,那为什么不是4呢?
这就要看sizeof了,sizeof中单独放数组名时,这里的数组名便表示整个数组,计算的是整个数组的大小,单位是字节。
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)。
所以除了sizefo和&这两种情况,其他情况数组名都代表着首元素地址
二、使用指针访问数组
有了前面知识的铺垫,再结合数组的特点,我们就可以很方便的使用指针访问数组了。
下面我们来看一串代码,看之前,我再给大家强调一些知识点:
- 数组在内存中是连续存放的
- 数组名是地址,是首元素的地址
- 可以使用指针来访问数组
- 指针的+-整数运算,方便我们获得每一个元素的地址
int main() { int arr[10] = { 0 }; int i = 0; int* p = arr; int sz = sizeof(arr) / sizeof(arr[0]); for (i = 0; i < sz; i++) { scanf("%d", p+i);//p+i==&arr[i] } for (int i = 0; i < sz; i++) { printf("%d ", *(p + i)); } return 0; }
这串代码可看出,p就代表着&arr,可借用p对arr进行赋值。
并且arr[i]与*(arr+i)两种写法是完全等价的。
因此*(i+arr)与上面两种写法也是相同的,所以我们肯定都会想到,将数组写成i[arr]这种形式可以吗?
我们来试一下:
这样来看结果也是可以的。
三、一维数组传参的本质
数组传参时,我们常能看到两种写法,
1.void Print(int*arr);
2.void Print(int arr[10]);
其实对于这两种写法,传过去的都是指针变量,无论写成什么样子。传参传的都是指针变量
即使按第二种写法,也无法将元素个数传过去。
所以数组传参时传过去的是首元素地址。
我们还要记住一点:形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。
四、二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里呢?
这就是二级指针:
看一下这张图片中的代码,可以先熟悉一下二级指针。
这次我们这是先认识一下二级指针,以后我们会对二级指针有一个更加深入的讲解。
当然还有三级指针。
五、指针数组模拟二维数组
指针数组是指针还是数组呢?
整形数组-存放整形的数组。
字符数组-存放字符的数组。
所以指针数组-就是存放指针的数组。
//指针数组模拟二维数组
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* arr[3] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
1.arr的第一个数组里放arr1的首元素地址
2.arr每个元素的类型是int*。
3.该数组里每个元素都是指针,所以它是一个指针数组
4.arr[i][j],也可以写成arr[i]+j,
5.相当于地址+j为向后挨个元素指向
总结:
本次我们主要是对数组与指针之间的联系做了讲解,如果对文章中哪里有不懂的地方,可以私信或者在评论区问我,我会一一回复的。有兴趣和我一起进步的小伙伴也可以私信我,大家一起加油!!!!!!!一起进步!!!!!!!