十四、指针
十五、结构体
十四、指针
指针是我们C语言中最重要的知识点,大家听不懂没关系,因为我们现在只是初识,到后面才深入探究,大家不要害怕指针,其实有时候就是我们心里作用:可能感觉太难了呀,学不会,感觉很复杂。事实上没有这么复杂。
1、内存
要谈指针,首先我们要先了解一下内存,内存是电脑上特别重要的储存器,计算机中程序的运行都是在内存中进行的,什么意思呢?
假如我们买一个电脑,这个电脑上有CPU、内存、硬盘。CPU:中央处理器,计算机在处理数据的时候都是由CPU来计算和处理的。CPU处理的数据来自内存,内存里的数据来自硬盘。我们的文件、数据、电影是不是都存放在硬盘里,当真正去看电影的时候,去运行我们程序的时候,其实都是把硬盘的内容加载到内存,内存的数据交给CPU进行处理。大概就是这么简单的逻辑,相信大家可以理解。
如果现在有一块大的内存等待我们使用,我们该如何有效的管理我们的内存呢?给内存的每一个单元编一个号
像上面给内存单元一个一个编号,假如有一天我们要找一个内存编号,这时候我们有这个编号,就可以凭借这个编号很好的找到这个内存单元 ,所以我们就想到了:
内存空间为了有效的进行管理:
1.把内存划分为一个个有效的内存单元(1字节)
2.给每个内存单元编号 = 地址(我们日常说的地址,比如一个房间号)= 指针(这三个意思一样)
C语言把地址也叫指针。未来,只要指定了一个地址,通过地址就能找到对应的内存单元。
访问内存 - 首先得有地址,有了地址才能找到内存单元!!!
这里一共32根地址线,这是我们物理的电线,这时候我们地址线上传过来电信号的时候:
32位的机器上:简单理解为有32根地址线
每根地址线存有一个0或者1,下面是32根地址线产生的所以组合,因为每跟电信号传过来0或者1,所以当我们32根地址线上出来的这个二进制的可能性有这么多一共2^32次方种。
这个时候我们注意一下,我们把2^32次方种可能当成地址编号的话,一个编号就能找一个内存单元,这样的话我们算一下,如果我们有2^32次方个地址,1个地址管理一个字节,所以2^32次方个地址总共能管理4GB的空间。
&a可以拿到a的地址,a的地址也是个数字啊,就像10你想存起来放到a里面去,你专门要为10开辟一块空间才能存放10对不对,&a假设取出0x0012ff48这个地址,这个地址作为16进制是不是也要存储起来,假设定义一个变量叫pa,我们的pa是不是用来存放指针的(指针==地址==内存编号),所以我们就把pa这种变量叫做指针变量,a都有类型,所以我们的pa也要有类型,就叫int*。
我们也可以通过pa来改变a的值,他的意思是通过pa里面的地址找到a,然后把他的值改成20。
大家可能有疑惑了,为什么我能直接改变a,为什么还要搞出来一个指针呢?我们现在先不做讲解,只要知道这个事情不用我们自己干了,而是交给别人干。
总结:
1. 内存会被划分以字节为单位的一个个内存单元
2. 每个内存单元都有编号,编号==地址==指针
3. C语言中创建的变量,其实是向内存申请一块空间,比如:int a = 10;就是向内存申请4个字节
的空间,每个字节都有地址
4. &a的时候,拿出的是4个字节中地址较小的那个字节的地址(编号)
5. 这个地址要存储起来,给一个变量,这个变量是用来存放地址(指针)所以叫指针变量:int* pa = &a;
6. pa中存放的是a的地址,要通过pa中的地址找到a,怎么写?*pa—> 通过pa中的地址找到a
*pa=20 本质是修改a
2、指针变量的大小
先说为什么是8,因为我是在64位下面打印的,所以是8,正常32位下面是4,所以一个指针大小为4。现在另一个问题来了,大家有没有发现现在不管是什么类型,指针大小都是4。
因为指针变量是用来存放地址的,指针变量的大小,就取决于存放一个地址需要多大的空间。一个地址存起来是不是需要32个bit位,32个bit位就是4个字节,所以一个指针变量的大小是4个字节
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
十五、结构体
结构体是C语言特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含:名字+年龄+性别+学号这几项信息
这里只能使用结构体来描述了
以上代码就是我们结构体创建,初始化,然后打印。
我们也可以把结构体初始化放到指针里面打印,代码如下
这里面我们用到了两个操作符
. 左边是结构体变量,右边是结构体成员
-> 左边是结构体指针,右边是结构体变量
我们现在是初识,不用去研究太深,慢慢来,循序渐进。