【C语言】指针、数组中的指针详解

0、前言:

在这里插入图片描述
指针本身已经是非常底层的东西了,什么是底层?一般说的底层就是和硬件比较接近的地方。
另外强调一点:计算机最重要的就是对数据的处理,所以数据的存放你是一定要知道的——数据存放在内存中!底层的数据就是二进制数,这你可以暂时不用管。

所以编程的本质,就是改变数据的流向 。比如和人家QQ聊天,就是将数据从头脑到手到键盘到内存到文件或显示器的过程。其中,内存就相当于一个数据中转站,所以本次我们讲指针,也是围绕这个中转站开始讲的。
所谓指针,就是指向内存的一个标记,所以指针就经常形象化就是内存中的地址。所以,你完全可以把地址当作指针。

问题1:内存为什么需要地址?
这个问题就相当于你问我这个世界上为什么会有这么多地名?地名就是标记,目的是为了【找到回家的路】,也就是找到家,对吧。所以地址就是为了找到内存,从而找到内存中的数据。因为前面我们说过,编程的本质就是改变数据的流向,而内存就是数据的中转站,所以我们必须给这个中转站一定的地址编号,方便我们控制数据的流向。
所以说地址最终还是为数据而服务的。因为我们要的不是地址,而是地址里面的宝藏和东西对吧,这些宝藏就是数据。

问题2:地址是数据吗?
对的,地址也是数据,但是计算机能单独识别和区分地址这种特殊的数据,而且,地址一般都比普遍的数据更短,对吧!

1、普通变量?指针变量?

接触比较广的同学,一般都会知道C语言中的变量可以分为这两种。
1、区别:
普通变量可以直接往里面存数据:

int a=12345;//a是普通变量

指针变量只能存指针(即地址):

int a=12345;//a是普通变量

//声明:*号代表这是一个指针变量,p是它的名字
int *p;
//使用:仅仅使用它的名字!
p=&a;
这样下来,指针p就携带了变量a在内存中对应的地址。

注:有些初学者就经常写成:*p=&a
这就没有正确区分声明和使用两个概念:
1.声明:声明有这个东西(名字),这个东西是什么类型的。
2.使用:使用名字

2、转换:
为了能够使用数据,一般需要转化为普通变量才能实现。

这时候你可能就会发问了:不是说scanf函数需要的是地址吗,还需要什么转换?
其实,scanf函数也是由代码写成的,然后放进头文件,所以说,只是你看不见scanf的那个大括号里面的内容而已,或许里面使用了转化呢!因为我们一直都是在使用名字——变量名,函数名,所以总会给我们一些错觉。

1.普通变量升级为指针变量:寻址符&
2.指针变量降级为普通变量 :指向符*

例子:

int a;//a是普通变量
scanf("%d",&a);//&a是地址,指针
printf("%d",a);//a是普通变量

char c;
scanf("%c",&c);//&c是地址,指针
printf("%c",c);//c是普通变量

char d[10];
scanf("%s",d);//d是地址,指针
printf("%s",d);//d是地址,指针

注意:只有基本数据类型的变量的printf才需要普通变量,
而数组是构造的数据类型,因此需要的仍然是指针。
这里用的是数组的首地址。

最后的声明:学习和使用指针需要掌握的三个方面:
①指针数据和普通数据本质是没有区别的,但是因为计算机能识别区分他们,
所以你必须把它俩当成两种不同的数据类型,以免混用。
比如:


②指针变量与普通变量之间的转换:指针有多重指针,但普通变量只有一级。普通变量是我们在编程中使用数据的窗口,指针与他们都存在对应关系。所以一定要学会判断指针的级别和哪个是普通变量,哪个是指针变量。因为指针变量一般是不可以直接用于提取内存中的数据的。
比如:


③构造数据类型定义的普通变量名本质是一个指针变量。注意区分声明定义格式和使用格式,声明定义一般包含两部分:数据类型,变量名。但是使用格式,是使用它的变量名。
比如数组名,指针变量名,结构体联合体定义的变量名,这些都是指针,包括函数名。
比如:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值