C中的语法的重难点莫过于指针,掌握指针,也就很容易上手C了
-----------前言
还是提几个个核心问题>
为什么要有指针变量?
因为把进程加载到内存中,CPU通过寻址来进行数据的处理。通过定义指针变量存放相应的地址,目的还是在于提高CPU的寻址效率。
(一)指针与指针变量
如何理解“指针是内存地址,指针变量是用来存放内存地址的变量”?
很多时候,我们常常把指针和指针变量搞混,然而事实上两者不仅仅在概念上存在差距。
在说之前不得不谈谈C中表达式的左、右值:
左值: a的空间。
右值:将a的内容赋值给b。
接下来上图:
在仅有此刻,pa既可以叫做指针==指针变量。
因此,指针就是地址,指针变量是用来保存地址(指针)的变量。
即:指针变量:空间(左)+内容(右)。
(二)指针变量类型和"*"
chat*
int*
double*
float*
struct st* .....
指针变量的类型多样,和我们理解的基本数据类型是一个概念,都是用来存放数据的。
①指针变量是存放地址的,地址是数据,
因此指针变量也是有大小的。
在x86下:
在64位下:
②对指针解引用(*)就是代表指针变量所指向的内容!
③ *pa表示的右值还是左值?
以指针变量的方式访问:
以0处地址访问:
上述两种方式都证明着,*p不是左值(空间),而代表右值(内容);
④进一步理解*p 和p:
⑤ 不管是对指针还是指针变量+1,都是加上其指向类型大小个字节
(二)指针与数组
数组:实质上就是相同数据类型的集合。在内存线性递增开辟空间。
① 如何理解数组名为数组首元素地址?&a[0] 与 &a的区别
此处,我们可以得出:
不管是数组首元素地址,还是整个数组的地址他们的数值是一样的。
但是对他们进行-1,+1是不同的!!
注:仅仅在& 、 sizeof单独出现数组名,表示整个数组。其余都表示首元素地址。
②数组的类型
下标,仍然是算在数组类型里面的!!
③深入理解解指针++
把指针pt看成不同的类型,那么对它执行增加或减少就不同。
④二维数组
顾名思义,二维数组仍然是数组,它是多个一维数组这样一个类型的集合。
从逻辑上我们把它理解行列式的形式,但事实上并不是。
同样,它也符合连续空间地址的地址开辟:
我们借此进行开始时,关于二维数组的练习:
答案是多少呢?
我们来进行如下分析:
在分析之前我们应当明确以下几个点:
(1)数组名只有单独使用在sizeof、&时,才表示整个数组的大小。
(2)不管是对地址还是指针解引用(*),与它的类型紧密联系。
对于数组而言,可以进行简化类型:int [4]。
难以理解的莫过于最后一个看似越界的式子:
我们可以把两者拿来比较一下。a数组的类型为int [4]
不管a数组里面的数字是多少,结果都是int [4]。
因为sizeof不会关数字下标的访问那是否越界了
而它求的仅仅是这个二维数字类型的大小。
总结:
①指针的出现就是为了提高cpu寻址的效率
②对指针 指针变量解引用向后访问的字节,由其类型大小决定
③数组的内存空间管理,是从低地址到高地址,线性递增开辟~
④数组的类型不仅仅包含(int cha double)
希望对你有帮助~加油!!