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

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

 

什么时候不同?

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

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

 

 什么时候相同?

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

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

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

 

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

ExpandedBlockStart.gif 代码
 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  }

 

输出:

ExpandedBlockStart.gif 输出
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 

 

大功告成~~ 

 

转载于:https://www.cnblogs.com/younes/archive/2010/01/20/1652569.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值