那就说说指针

指针是什么
相信大家生活中都见过指针,比如手表指针,车上的不管是油表还是里程表还是速表,大家都能看见指针,这些指针都有着同样的地方,就是它是指向一个具体的位置的,就比如现在中午12.那么手表指向的位置就是12,就是这个道理。
那么c语言中的指针是什么呢,没错和现实生活中的指针一样,他也是指向一个固定的位置,那么大家想想c语言的位置是什么呢,没错就是指的内存地址,所以一个指针就是一个指向地址的变量,也就是说指针的本质就是一个地址变量。

指针定义

讲到指针的定义,就要提起之前说的取址,与取值运算符了
取址运算符是&
取值运算符是*
因为指针存放的是地址所以我们在一般在给指针赋值的时候都会用到&

看下列代码
#include<stdio.h>
int main(){
	//这里先定义两个变量
	int a = 45;
	char i = 's';
	//然后定义指针变量
	int *p = &a;
	
	这里就涉及到了指针的定义格式
	他是以数据类型名加上*符号来定义的
	也就是向下列一样
	char *p;
	int *p;
	double *p;
	这里要注意的是,这样定义之后的指针名是p不是*p
	*p就是对指针进行取值了

	当然我们都知道指针是以个地址,所以如果我们要对其赋值的话,应该是给其
	赋值一个地址
	所以就要用到取址符号了
	int *p = &a;
	所以这行代码的作用就是先创建一个指针变量p再将a的地址赋值给p

	这里大家就要问了 竟然指针p指向的是一个地址,那么为什么还要数据类型名呢

	这里就简单的讲下c语言的内存存放
	比如说定义一个字符串
	char i[] = "abcd";
	那么这个在c语言中是怎么存放的呢
	首先我们知道一个char字符的占用内存是1;
	所以他应该是这样存放的
	地址   值
	1001	a
	1002	b
	1003	c
	1004	d
	
	这样顺着存的,每一个字符站一个地址
	然后如果这时候我们再定义两个变量
	int j = 12;
	char p = 's';
	那么存放的样子就变成了这样
	1001 a
	1002 b
	1003 c
	1004 d
	1005 12
	1009 s
	没错这个时候大家就要问了,怎么突然从1005变成了1009了
	因为我们int类型在c语言中占4个内存(可能会根据编译器的不同有差距)
	所以说12这个int行占了四个字节的内存,这样地址的顺序就会乱
	我们再假设
	比如定义一个指针指向c
	那么就是char *p = &i[2];
	这时候p = 1003
	所以我们将p+1
	那么p就来到了1004
	这个时候我们再对p取值
	*p 这个值就是d
	那么p + 1不是单纯的讲p的地址+1,而是指向下一个单位,
	因为char所占的字符内存就是1
	所以这里就会加一,
	如果这里数据类型是int 地址就会+4而不是+1
	这时候大家就会说,啊
	编译器又不是小枫,怎么可能这么聪明
	对啊编译器不聪明,但是小枫聪明,
	小枫从小就养成了在给指针定义的时候给定数据类型的好习惯
	所以指针根据给出的数据类型他会判断指向下一个地址的时候
	该加几,相信大家都懂了把。 
}

指针的使用

关于指针的使用,因为这里是一维指针啊,我们就简单的提一下

首先啊
刚刚上面我讲了下数据在c语言中的存放规则
那么数组是我们c语言中的一种数据类型,那么他是怎么储存的呢
我们定义一个数组
int i[] = {1,2,3};
他的存放格式就应该是
1001	1
1005	2
1009	3
这样存在一起的一个,顺着存的
只不过因为数据类型是int 每个占4个字节
所以说每一个地址之间都是+4
那么i 这个指的是什么呢?
也就是数组名是什么呢
没错数组名其实是数组中第一个元素的地址
什么意思呢
比如这里我们打印i 就会打印1001
如果我们对i进行取值就会返回 1001
懂了嘛,这个时候大家就会说,这玩意我知道,这玩意是地址,又存的有值,这玩意不是指针嘛
别骗我,我读过书
没错,数组名其实就是一个指向数组第一个元素的指针,

所以指针从这里开始就要变得复杂了
什么时候是值什么时候是址,这就是指针的灵魂所在
比如看下面的代码

int main(){
	int i[] = {1,2,3};
	int *p = i;
	int j = *(p+1);
	printf("%d",j);
}
这个的结果是什么呢
首先我们来分析一下
i是以个数组存放着三个数据1 2 3
然后指针p指向的是i这个地址
i的地址是数组中第一个元素的地址,也就是1的地址
那么p = 1的地址
所以对p进行取值就是*p = 1;
然后看j
j是将指针p指向下一个位置,也就是说从数组中的1指向了下一个元素2
所以p+1就是2的地址
然后再对其取值就是2
所以说这里j打印出来就是2

那么问题来了
p现在指向的哪

小枫说,哈哈哈难不倒我,刚刚不是说了指针指向了2嘛
那p肯定是存放着2的地址啊

哈哈哈,不愧是你啊小枫
小枫从小就很蠢

这里小枫的想法是错的啊,再j那个语句中
p确实指向了2的位置
但是并没有赋值给p这个指针变量
你懂嘛
就是指针并没有发生改变,只不过是在你调用那个表达式的时候
他稍微的动了一下

就像生活中的速度表一样,指针是指向0的当你开始跑的时候
他就会指向70 80之类的
但是最终他还是指向0

也就是说,指针没有二次赋值的话,不论怎么指
最终还是指向最开始赋值的那个地址

然后大家发现了,好像用指针也可以访问数组中的每一个值啊
那不是跟索引一样
没错
就是跟索引一样
所以说,数组的索引我们就多了一个方法,一个是之前讲的下标索引
还有一个就是今天讲的指针
哇卡达?

好了今天的学习就到这了
有事请
1257362372
感谢观看
红豆泥阿里嘎多
@2022/4/26

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值