C语言指针和数组的关系
指针与数组的关系和区别
前言
什么??你还分不清指针和数组有什么关系?那快来看看这篇博客吧,相信你读完以后一定会有所收获!
预备知识
&表示取地址,也就是把地址取出来给你
*表示解引用,也就是根据地址追根溯源去找对应的那个元素
本质关系
指针的本质
指针的本质是一种变量,什么变量呢?它是一个存放内存地址的变量,也就是说指针代表的就是一个地址。但是我们注意,既然我们说它是一个变量,说明指针的值是可以被改变的!这就是它很重要的一点。
数组的本质
那么数组又是什么呢?数组它是一种数据类型。也就是说,你把一堆数放到一块,它们就构成了一组数,也就是一个数组。数组是一堆元素的集合,在内存中也是有属于自己的地址的。它和普通的数据不同的在于,它的数据是连续储存的,也就是说每一个元素的地址都是连续着的(也就是它们被放到一块了)。
因为数组中的元素的地址是连续的,所以我们用数组名来代表数组的首地址。
换言之,arr[10]是一个长度为10的数组,我们就可以用arr来表示这个数组的首地址。
我们来看个例子
int a[5]; for(int i=0;i<5;i++) { scanf("%d",a+i)//看到了吗,这里就是应用了用数组名代表首地址,那么 }
看到了吗,这里就是应用了用数组名代表首地址,那么a就表示a[0]的地址,a+i就表示a[i]的地址,至于为什么是a+i下文解释
当指针和数组放到一起
指针是一个存放内存地址的变量,而数组名可以代表首地址,当两者放到一起,也许。。。。。。
先来看一个例子
int arr[10]={0}//对数组初始化 int* pa=arr;
这里第二行就让指针赋值为arr数组的首地址,那么从现在pa和arr就是相同的了(两种情况除外)
arr[i]和pa[i]是一样的
arr+i和pa+i是一样的
唯一不同的是,arr是指针常量,不可以被改变;而pa是指针变量,可以实现赋值和加减操作!
填坑环节
1.为什么是a+i呢
a+i并不是单纯的地址+1,而是a加上了sizeof(a的类型)*1,变成了a[i]的地址,从而实现了对a[i]的访问。
2.哪两种情况除外呢
第一种:sizeof(数组名)和sizeof(指针变量名)是不一样的
前者表示的是整个数组的大小,后者表示的是指针的类型大小
第二种:&数组名 和 &指针变量名是不一样的
一方面,数组名是指向首个元素的指针,&数组名是整个数组的指针。在指针加减整数的时候,前者以一个元素为单位,后者以整个数组为单位。
另一方面,&指针变量名是储存指针变量的地址(类似于碟中谍?)
总结
在初始化指针等于数组名以后,指针和数组是等价的,但是两种情况例外
第一种:sizeof(数组名)和sizeof(指针变量名)是不一样的
前者表示的是整个数组的大小,后者表示的是指针的类型大小
第二种:&数组名 和 &指针变量名是不一样的
&数组名是整个数组的指针,&指针变量名是储存指针变量的地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具