这篇重点是介绍指针,同时也是C语言学习的重点。另外尽量对之前遗漏的一些 内容进行补充
目录
指针
首先我们口头上说的指针一般是指针变量,而要说明指针变量则需要从内存开始
内存
内存是计算机的存储器,作用是暂时存放CPU运行时的数据。
为了更加有效地使用内存,就将内存划分成多个小单元,一个小单元的大小为1个字节。
那如何对这些小单元进行访问?
答案是给每一个小单元进行编号,通过编号进行访问,这些编号又称为这些内存单元的地址。
指针变量就是用于存放地址的变量
取地址符
之前介绍操作符时有介绍取地址符(&),但只是一笔带过,这里着重介绍
假设新建一个变量a
char a= 1;
通过“&”即可找到变量所处的内存单元的地址
如果是int float等这些大于1个字节的变量则打印第一个字节的地址
存储地址
存储地址前需要定义一个指针变量,以上述的变量a为例
char*p
p=&a;
p是变量名称,*表示这是一个指针变量,char表示变量指向的对象类型
解引用操作符
我们存储地址的目的是希望通过地址找到对应的对象和改变对象,这就需要解引用操作符“*”来完成,具体使用如下
指针变量的大小
首先,指针变量的大小与*前面的数据类型无关,指针变量的大小只与计算机的操作系统有关。计算机的操作系统一般我们听过最多的是32位或64位,这里的32和64指的是地址线的数量。地址线是用于传输地址信息用的。在数字逻辑电路中有高电平和低电平之分,低电平表示0,高电平表示1。32位操作系统的32根地址线同时通电就产生32个二进制位,大小为4byte,64位同理,大小为8byte。所以在32位操作系统中指针变量大小为4byte,64位操作系统为8byte。
结构体
结构体的出现是为了描述一些复杂的对象,比如描述一株植物,它属于什么科?根、茎、叶、花果有什么特点?有什么显微特征等。结构体的基本使用如下
那是否可以使用指针来访问?
答案是可以,假设定义一个指针变量来指向结构体
struct games*ps=>a;
打印结构体成员时(以第一个成员为例)gta.name换成ps->name即可
补充
- 在使用printf函数进行打印时经常会写%d、%c等这些符号,它们表示打印数据时以什么样的形式来打印,常见的如下
%d:整数型十进制数据
%f:浮点数
%p:地址
%x:十六进制
%o:八进制
%lf:双精度浮点数
%c:字符
%s:字符串
%u:无符号数
- 负数存储在内存中的补码有所不同
整数在打印时以原码打印,存储时以补码存储,整数和0的原码和补码相同,但负数却不一样。
首先,整数的二进制的最高位为符号位,符号位为1表示这是负数,负数的原码符号位不变,其它位按位取反得反码,反码+1得补码。
结尾
C语言的主要的内容基本上介绍完毕,各个内容的深层次的知识点在后续的时间里会不断更新,不足的地方欢迎更正,感谢你看到这里。