C语法陷阱:指针与数组

理解指针与变量间的关系
服务器君一共花费了358.684 ms进行了7次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

任何指针都是指向某种类型的变量,例如,如果有这样的语句:

int *ip;

就表明ip是一个指向整型变量的指针,又如果声明:

int i;

那么我们可以将整型变量i的地址赋给指针ip,就像下面这样:

ip=&i;

而且,如果我们给*ip赋值,就能够改变i的取值:

*ip=17;

如果一个指针指向的是数组中的一个元素,那么我们只要给这个指针加1,就能够得到指向数组中下一个元素的指针,同样的,如果我们给这个指针减一,得到就是指向该数组中前一个元素的指针。对于除了1以外的其他整数的情形,以此类推。

上面这段讨论暗示了这样一个事实:给一个指针加上一个整数,与给该指针二进制表示加上同样的整数,两者的含义截然不同。如果ip指向一个整数,那么ip+1指向的是计算机内存中的下一个整数,在大多数现代计算机中,它都不同于ip所指向地址的下一个内存位置。

如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减,这样做是有意义的,例如:

int *q=p+i;

那么我们可以通过q-p而得到i的值,值得注意的是,如果p与q指向的不是同一个数组的元素,即使它们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得的结果仍然是无法保证其正确性的。

前面已经声明了a是一个拥有3个整型元素的数组。如果我们在应该出现指针的地方,却采用了数组名来替换,那么数组名就被当作指向该数组下标为0的元素的指针,因此如果我们这样写:

p=a;

就会把数组a中下标为0的元素的地址赋值给p。注意这里我们并没有写成:

p=&a;

这种写法在ANSI C中是非法的,因为&a是一个指向数组的指针,而p是一个指向整型变量的指针,它们的类型不匹配,大多数早期版本的c语言实现中,并没有所谓的数组的地址这一概念,因此&a或者被视为非法,或者就等于a。

继续我们的讨论,现在p指向数组a中下标为0的元素,p+1指向数组a中下标为1的元素,p+2指向数组a中下标为2的元素,一次类推。如果希望p指向数组a中下标为1的元素,可以这样写:

p=p+1;

当然,该语句完全等同于下面的写法:

p++;

除了a被用作运算符sizeof的参数这一情形,在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针。正如我们合乎情理的期待,sizeof(a)的结果是整个数组a的大小,而不是指向数组a元素的指针的大小。

延伸阅读

此文章所在专题列表如下:

  1. C语法陷阱:从变量与函数的声明到类型转换符
  2. C语法陷阱:理解(*(void(*)())0)()
  3. C语法陷阱:理解如何声明一个数组
  4. C语法陷阱:指针与数组
  5. C语法陷阱:C语言的二维数组模拟

本文地址:http://www.nowamagic.net/librarys/veda/detail/2033,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2033

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《代码整洁之道》 马丁(Robert C. Martin) (作者), 韩磊 (译者)

软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。《代码整洁之道》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,《代码整洁之道》作者给出了一系列行之有效的整洁代码操作实践。这些实践在《代码整洁之道》中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。

更多计算机宝库...