到了初始c语言的终末篇喽,扫盲篇要结束啦!
打个心里预防针:这篇文字解释要多一些(手动滑稽)
目录
1.指针(c的灵魂)
1.1 指针是什么(地址)
引入:
1.2 指针的意义? ? ? ?正如上面的故事中,门牌号可以极大的方便寻找某一个具体的宿舍。也许宿舍楼也不是很大,找找好像也没那么麻烦。那我们来进行一个小小的算数。
补充:
1.3指针的使用(解引用)
1.4指针与指针变量
1.5指针变量
2.结构体初识
最后:
1.指针(c的灵魂)
1.1指针是什么(地址)
引入:
? ? ? ?来听一个故事,有一个包工头,建了一个学生宿舍楼,但是没有贴门牌号后楼层号,现在包工头把李四带到了一个宿舍里(而李四不知道自己在哪个宿舍哪层楼),王五来找李四,正在楼下,现在要求李四和王五只能通过电话沟通且李四不能在窗边挥手或做其他明显标识,让李四指挥王五到宿舍里找他,李四应该怎么说?最笨的方法当然就是一个房间一个房间的找,好像也只能一个房间一个房间的找,就算有其他方法,似乎也并没有什么十分有效的方法。
? ? ? ?那有什么解决方法呢?很显然,给楼层和宿舍装上号牌就行了,那么宿舍的号牌就相当于这个宿舍的地址,号牌是指向这个宿舍的,具有指向性,而在c中,我们给这个门牌起了个别致的名字,叫作指针,门牌就是地址,因此指针就是地址,而地址具有了指向性。
1.2指针的意义 ? ? ? ?正如上面的故事中,门牌号可以极大的方便寻找某一个具体的宿舍。也许宿舍楼也不是很大,找找好像也没那么麻烦。那我们来进行一个小小的算数。
? ? ? 我们把内存空间当成宿舍楼,把每一个宿舍当作一个内存空间,一个内存空间分1字节(byte)的内存空间(这个先记住就好)。
? ? ? ?由于1GB=2^10 KB=2^20 MB =2^30 B(Byte), 因此4GB = 2^32 B,因此在4GB的空间里分了2^32个内存小空间(一个空间1个b),若CPU要想在如此巨大的空间里找到它想要的那块小空间里的内容该有多费劲,若穷举查找,就会使得cpu读取数据的速度大大大大的降低,而且,这也不现实,虽然CPU是个机器,不会感觉到累和麻烦,但是万一第2^15个内存空间里存放着10(假设CPU想找的是第2^25空间里的10),第2^25个内存空间里同样存放着10,CPU就会把第一个10拿走,这怎么行呢?就像两个宿舍里分别放着张三和李四的东西,放的东西相同,李四直接进来就把张三的东西拿走了,这不就离谱吗?所以这并不可行,因此需要给每一个地址空间进行编号(编号各不相同),而编址是由计算机进行的,即计算机一经制造出来就有了确定的编址,这个编址是无法进行更改的,属于常量。(%p是输出地址的格式 ),而我们能做更改的是通过地址来访问内存然后其中存放的内容,但地址本身是不变的。
补充:
?
? ? ? 在第一张图中,我们知道strlen遇到’\0’会自动停止,但字符串只开辟了5个连续的空间,strlen却读取了42个字符,说明它肯定顺着字符串地址连续向后访问了其他不归属与它的空间
? ? ? 如上图,当strlen访问了‘g’之后继续向后访问,访问了不属于自己的空间是属于越界访问的,就像你看了别人的信,这是一种违规操作,那为什么还能进行呢?在回答这个问题之前,我们先来了解一下哨兵,哨兵,顾名思义就是放哨站岗的,在c中,内存块中随机存放着哨兵,当遇到违规操作时,会进行强制停止,但由于并不是每个内存块中都有着哨兵站岗维护秩序,所以strlen依然可以在遇到哨兵之前访问其他地址,但我们并不知道后面的地址存放着什么,给其这么大的访问权限,万一更改了其他空间的重要内容怎么办,因此,c规定,允许在遇到哨兵之前访问不属于自己的空间,但是被限定了权限,也就是只能让你看,不允许进行更改,否则强制退出。
? ? ? ?第二张图依然是42,说明计算机对该数组存放的空间是没有改变的,向后连续访问依然是在上次的地方遇到哨兵。
1.3指针的使用(解引用)
? ? ?我们已经知道指针就是地址,而地址是一种数据,数据是可以被存储的,因此指针(或者说地址)是可以被存储的,用来存储地址(指针)的变量叫作指针变量,根据存放指针的类型(此时根据地址内存放数据的类型定义指针变量的类型即可,不必深究)定义指针变量类型即可,而指针具有指向性,指针变量里存储的地址指向该地址存放的数据,要想访问这个数据,我们就需要解引用(*)操作符,通过这个操作符,我们就可以找到这个数据?
具体解析可看上图注释,尤其注意的是 ?*p就是a,就是a,就是a本身。
1.4指针与指针变量
? ? ?指针是地址,地址是数据,数据可以被存储。指针是指针变量存储的内容,指针(地址)是常量,不可更改。
? ? ?指针变量是变量,存放着指针(地址),可以进行更改。
1.5指针变量
? ? ?指针变量是一种变量类型,在32位中(32个bit即4个B)占四个字节的空间大小(无论什么类型的地址,都属于指针变量的类型,32上均为4个字节),64位中占8个字节的空间
? ? ? 开始可以先这么理解:指针变量就如同一个个宿舍,不同类型的指针变量代表着宿舍里放着不同类型的东西,有多有少,虽然储物可能不同,但宿舍大小是相同的(4个字节或8个字节)。
2.结构体初识
? ? ? c语言有很多种内置数据类型,但一个对象通常是由多个元素构成的,不能用单一的类型去表达,因此就有了结构体(自定义数据类型)。
? ? ? 自定义类型写在函数外,花括号最好要加分号。如图,定义了类型 struct car
? ? ? 在main函数中可以通过自定义的类型开辟该类型变量并对其进行具体定义
? ? ? 如图就定义了类型为 struct car的变量bmv,赋值类似于数组中对多元素的赋值,用花括号,
? ? ?打印时需要用到点操作符(.)(指针要用->,此处略),如bmw.brand,即访问变量bmw下的类型为cha变量brand。
最后:
? ? ? 初始c语言的'总'已经写完了,我将按照总分的形式进行具体的阐述,c语言初始是‘总’,也是扫盲篇,让大家对c语法先有基本的了解,后面会继续纵向剖析。
|