我们来谈谈指针和数组1~

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)

希望对你有帮助~加油!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值