C与指针:第六章:指针

本文详细介绍了C语言中的指针操作,包括间接访问(解引用)指针、指针常量的强制类型转换、指针的算术运算及关系运算。通过实例解析了指针加减整数的含义,以及如何在不同情况下合法地对指针进行比较,强调了指针越界的风险及其对类型判断的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、通过一个指针访问它所指向的地址的过程称为间接访问或解引用指针。这个用于执行简介访问的操作符是单目操作符。

2、*&a = 25;     将25赋值给变量 a 。&操作符产生变量 a的地址,它是一个指针常量(这个指针常量并不需要知道它的实际值),* 操作符访问其操作数的所表示的地址。

3、指针常量

假定变量 a 存储于位置100,*100 = 25; 这条语句是错误的,因为字面值100的类型是整型,而间接访问操作数只能作用于指针类型表达式。如果确实想把25存储于位置100,必须使用强制类型转换。          *(int *)100  =25;  强制类型转换把值100从“整型”转换成“指向整型的指针”,这样对它进行间接访问就是合法的。

4、指针的算数运算:

1)指针  +(-)整数:

表示从当前指针位置向前或向后移动该指针类型所占字节数个字节。

2)指针  -   指针

当两个指针都指向同一数组中的元素时,才允许从一个指针减去另一个指针,如 float array[5];  p1 指向 array[i], p2指向 array[j], 那么p2 - p1 的值就是 j - i 的值。

5、指针的关系运算:

当两个指针都指向同一个数组中的元素时,用关系运算符( <    <=    >   >=)对指针进行比较也是可能的。

例如:   float values[N_VALUES];

float *vp;

 

for(vp = &values[0]; vp < &values[N_VALUES]; )

*vp++ = 0;

这是合法 的,这个指针常量所指向的是数组最后一个元素后面的那个内存位置,虽然在最后一次比较时,vp 也指向了这个位置,但由于我们此时未对 vp 执行间接访问操作,所以它时安全的。也可以使用 != 代替 < 。

改为下面循环合法:

for(vp = &values[N_VALUES]; vp > &values[0]; )

*--vp = 0;

改为下面循环则存在问题:

for(vp = &values[N_VALUES - 1]; vp >= &values[0]; vp--)

*vp = 0;

在数组第一个元素被清除后,vp 的值还将减去1,而接下来的一次比较运算是用于结束循环的,此时,表达式 vp >=&values[0] 的值是未定义的,因为vp 移到了数组的边界之外。标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较(但不能进行间接访问操作),但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较。

6、如果一个值的类型无法简单的通过观察它的位模式来判断,那么机器是如何知道应该怎样对这个值进行操作的?

机器无法做出判断,编译器根据值的声明类型创建适当指令,机器只是盲目的执行这些指令。

计算机内存中的每个位置都由一个地址标识。通常,邻近的内存位置合成一组,这样就允许存储更大范围的值。指针就是它的值表示内存地址的变量。

无论是程序员还是计算机都无法通过值的位模式来判断它的类型。类型是通过值的使用方法隐式的确定的。编译器能够保证值的声明和值的使用之间的关系是适当的,从而帮助我们确定值的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值