《C和指针》笔记(六)

本文深入介绍了C语言中的指针,包括指针的初始化、间接访问(解引用)以及指针运算。强调了未初始化指针的危险性和指针算术在数组上下文中的应用。此外,还讨论了NULL指针的使用以及指针比较的限制。文中提醒开发者应避免对未初始化的指针进行间接访问,并指出指针运算在非数组环境中的不确定性。
摘要由CSDN通过智能技术生成

(六)指针

值与类型

变量名abcde
地址上内容112-11078523331100108

int a = 112, b = -1;
float c = 3.14;
int *d = &a;
int *e = &c;

c所存储的是浮点值,可是在地址上的内容却是一个整数?
因为该变量包含了一系列内容为0或者1的位。它们可以被解释为整数,也可以被解释为浮点数,这取决于它们被使用的方式。

不能简单地通过检查一个值的位来判断它的类型,必须观察程序中这个值的使用方式。

指针变量的内容

指针的初始化是用&操作符来完成的,它用于产生操作数的内存地址。
int *d = &a;
d为指针变量

间接访问操作符

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

d的值是100.当我们对d使用间接访问操作符时,它表示访问内存位置100并察看那里的值。

NULL指针

标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。

如果已经知道指针将被初始化为什么地址,就把它初始化为该地址,否则就把它初始化为NULL。

指针运算

当一个指针和一个整数量执行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小,“调整”就是把整数值和“合适的大小”相乘。

考虑下面这个循环:

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

这个循环将数组元素以相反的次序清除,当vp指向数组第1个元素时,循环便告终止,不过这发生在第1个数组元素被清除之后。

再来看看下面这个循环:

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

这个循环存在一个问题:比较表达式vp >= &values[0]的值是未定义的,因为vp移到了数组的边界之外。
标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第1个元素之前的那个内存位置的指针进行比较。
在绝大多数C编译器中,这个循环将顺利完成任务。然而还是应该避免使用它,因为标准并不保证它可行。

总结

声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须进行初始化:或者使它指向现有的内存,或者给它分配动态内存。对未初始化的指针变量执行间接访问操作是非法的,而且这种错误常常难以检测。其结果常常是一个不相关的值被修改,这种错误是很难被调试发现的。

指针运算(把一个整型值加到一个指针上或者从一个指针减去一个整型值)只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的指针执行算术运算是非法的。

如果两个指针都指向同一个数组中的元素,那么它们之间可以相减,表示两个指针在数组中相隔多少个元素。如果两个指针并不是指向同一个数组的元素,那么它们之间进行相减就是错误的。

任何指针之间都可以进行比较,测试它们相等或不相等。如果两个指针都指向同一个数组中的元素,那么它们之间还可以执行<、>等关系运算,用于判断它们在数组中的相对位置。对两个不相关的指针执行关系运算,其结果是未定义的。

1
1
1
1
1
1
1
强烈安利本书!博客所述都是概念性内容的记录,只有看原书才能更好地掌握指针内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值