关闭

老调重谈:C语言中的指针和数组

发表于:2010-1-22 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
DotNet

  在C语言中,有时候指针和数组等效,有的时候却不然。

  什么时候不同?

  1. 数组名本身就代表一个地址。指针代表地址的地址。所以,指针、数组的定义和可能有的多处的声明要严格匹配!不能将在一个地方定义的数组,在他处声明为指针。反过来也不行!

  2. 指针和数组都可以在他们的定义中用字符串常量进行初始化。尽管看上去一样,但底层的实现机制却不同。定义指针时,编译器不为指针所指向的对象分配空间,它只是分配指针本身的空间。除非在定义的同时赋给指针一个字符串常量进行初始化。例如:char *p = “breadrain”;  注意,只有字符串常量才如此,不要指望为浮点数之类的常量分配空间:float *pip=3.14; 此语句错误,无法通过编译。(在ANSI C中,初始化指针时创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串程序会出现未定义的行为)。数组也可以用字符串常量初始化,并且可以修改:char a[] = “breadrain“;

  什么时候相同?

  1. 表达式中的数组名被编译器当做一个指向该数组第一个元素的指针。

  2. 在函数参数的声明中,数组名被编译器当做指向该数组第一个元素的指针。

  你要记住,在表达式中,指针和数组是可以互换的,因为它们在编译器里的最终形式都是指针,并且都可以进行取下标操作。以为数组的下标操作是建立在指针的基础上的。所有在函数调用时候传递给被调用函数的数组,在编译的时都被编译器改写为指针,即使被调用函数的型参是否声明为数组。当想把数组定义为函数的参数时,可以把它定义为数组,也可以定义为指针。不管选择那种方法,在函数的内部事实上获得的是一个指针!

  课后练习(如果你预测的结果正确,说明你真正理解了C语言中的数组和指针):

  代码

  1 #include <stdio.h>
  2
  3 char ga[] = "abcdefghi";
  4
  5 void my_array_func(char ca[10])
  6 {
  7     printf("sizeof array param = %#x \n", sizeof ca);
  8     printf("addr of array param = %#x \n", &ca);
  9     printf("addr of (ca[0]) = %#x \n", &(ca[0]));
  10     printf("addr of (ca[1]) = %#x \n", &(ca[1]));
  11     printf("++ca = %#x \n\n", ++ca);
  12 }
  13
  14 void my_pointer_func(char *pa)
  15 {
  16     printf("sizeof ptr param = %#x \n", sizeof pa);
  17     printf("addr of ptr param = %#x \n", &pa);
  18     printf("addr of (pa[0]) = %#x \n", &(pa[0]));
  19     printf("addr of (pa[1]) = %#x \n", &(pa[1]));
  20     printf("++pa = %#x \n\n", ++pa);
  21 }
  22
  23 int main()
  24 {
  25     printf("sizeof global array = %#x \n", sizeof ga);
  26     printf("addr of global array = %#x \n", &ga);
  27     printf("addr of (ga[0]) = %#x \n", &(ga[0]));
  28     printf("addr of (ga[1]) = %#x \n\n", &(ga[1]));
  29     my_array_func(ga);
  30     my_pointer_func(ga);
  31 }

  输出:

  sizeof global array = 0xa
  addr of global array = 0x804a018
  addr of (ga[0]) = 0x804a018
  addr of (ga[1]) = 0x804a019
  sizeof array param = 0x4
  addr of array param = 0xbfd4ea50
  addr of (ca[0]) = 0x804a018
  addr of (ca[1]) = 0x804a019
  ++ca = 0x804a019
  sizeof ptr param = 0x4
  addr of ptr param = 0xbfd4ea50
  addr of (pa[0]) = 0x804a018
  addr of (pa[1]) = 0x804a019
  ++pa = 0x804a019

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号