C指针理解

一.关于指针

要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

1.指针的类型

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部
分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各
个指针的类型:
(1)int*ptr;//指针的类型是int*
(2)char*ptr;//指针的类型是char*
(3)int**ptr;//指针的类型是int**
(4)int(*ptr)[3];//指针的类型是int(*)[3]

(5)int*(*ptr)[4];//指针的类型是int*(*)[4]

2.指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
(1)int*ptr; //指针所指向的类型是int
(2)char*ptr; //指针所指向的的类型是char
(3)int**ptr; //指针所指向的的类型是int*
(4)int(*ptr)[3]; //指针所指向的的类型是int()[3]
(5)int*(*ptr)[4]; //指针所指向的的类型是int*()[4]
在指针的算术运算中,指针所指向的类型有很大的作用。

3.指针的值(或指针指向的内存单元的地址)

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

4.指针本身所占据的内存

指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。


二.指针的运算

指针的运算与指针所指向的类型是息息相关的。

如果指针指向的是一个内存中的数据,那么这个指针的值就是这个数据的地址,但是这个数据在内存中的存储形式是一个字节一个字节存储的,那么确切的说指针是这个数据在内存中存储的首地址,当我们对指针进行解引用(*)操作的时候,那么CPU就会根据这个指针的值和指针指向元素的类型的大小去内存中取出这个元素。在这个过程中我们用到了sizeof(指针所指向元素的类型)这个值.

指针的运算跟指针指向元素的类型有什么关系呢?

可能大家已经明白,对指针进行p++操作的时候指针会指向下一个元素,在这个过程中偏移的大小就是sizeof(指针所指元素的类型)。


三.指针和数组的区别

数组的首地址是一个常量,可以视为一个常量指针,int * const p ;能够改变这个地址中值,但是不能改变这个指针的值。

实际上数组的下标在编译器看来是通过指针来实现的,例如 int a[20] ; a[i]被编译器解释为*(a+i) 。

一般情况下可以把数组的首地址赋给一个指针,那么这个指针就可以引用这个数组的值了,可以通过数组形式p[i]和指针形式*(p+i)来访问目标数据。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值