如何理解数组作为函数参数时,数组名就是指针?

原文:http://blog.csdn.net/microsues/article/details/6112898

在《Expert C Programming》这本书中,第202页有这样一句话:在函数参数的声明中,数组名被编译器当着指向该数组第一个元素的指针。通过实例测试,这句话的意思就是:在声明这个参数的整个函数作用域内,数组名就是指针。

见测试用例:

  1. #include<iostream>  
  2. #include<stdio.h>   
  3. using namespace std;  
  4. void fun(char ca[])  
  5. {  
  6.     printf("%x/n",ca);           //打印数组第一个元素的地址   
  7.     printf("%x/n",&ca);          //打印的数组第一个元素的地址的地址  
  8.     printf("%s/n",ca);           //打印字符串  
  9.     printf("%s/n",&ca);          //乱码  
  10.     printf("%x/n",&(ca[0]));     //打印数组第一个元素的地址   
  11.     printf("%s/n",&(ca[0]));     //打印字符串  
  12.     //主要cout和printf的区别.  
  13.     cout<<"ca = "<<ca<<endl;               //打印字符串  
  14.     cout<<"&ca = "<<&ca<<endl;             //打印的数组第一个元素的地址的地址  
  15.     cout<<"&(ca[0]) = "<<&(ca[0])<<endl;   //从第一个元素开始打印字符串  
  16.     cout<<"&(ca[1]) = "<<&(ca[1])<<endl;   //从第二个元素开始打印字符串  
  17. }  
  18. void fun2(int ca[])  
  19. {  
  20.     printf("%x/n",ca);         //打印数组第一个元素的地址   
  21.     printf("%x/n",&ca);        //打印数组第一个元素的地址的地址  
  22.     printf("%x/n",&(ca[0]));   //打印数组第一个元素的地址  
  23.     printf("%x/n",&(ca[1]));   //打印数组第一个元素的地址  
  24.     //与主函数中的打印有啥区别??  
  25.     cout<<"ca = "<<ca<<endl;        //打印数组的第一个元素的地址   
  26.     cout<<"&ca = "<<&ca<<endl;      //打印的数组第一个元素的地址的地址  
  27.     cout<<"&(ca[0]) = "<<&(ca[0])<<endl;   //打印数组的第一个元素的地址  
  28.     cout<<"&(ca[1]) = "<<&(ca[1])<<endl;   //打印数组的第二个元素的地址  
  29. }  
  30.   
  31. int main()  
  32. {  
  33.     char arr[9] = "abcdefg";  
  34. //  char arr[9] = {'a','b','c','d','e','f','g'};  
  35.     cout<<endl<<"############ test fun  ############"<<endl;  
  36.     fun(arr);  
  37.     int arr_int[9] = {1,2,3,4,5,6,7};  
  38.     cout<<endl<<"############ test fun2  ############"<<endl;  
  39.     fun2(arr_int);  
  40.     cout<<endl<<"############ test main  ############"<<endl;  
  41.     printf("%x/n",arr);           //打印数组第一个元素的地址   
  42.     printf("%x/n",&arr);          //与上面等价,打印数组第一个元素的地址  
  43.     cout<<"arr = "<<arr<<endl;          //为什么输出的是字符串,而不是地址  
  44.     cout<<"&arr = "<<&arr<<endl;        //打印字符串的首地址  
  45.     printf("%s/n",arr);           //打印字符串  
  46.     printf("%s/n",&arr);          // 与上面等价,打印字符串  
  47.     cout<<endl;  
  48.     cout<<"arr_int = "<<arr_int<<endl;      //打印数组第一个元素的地址     
  49.     cout<<"&arr_int = "<<&arr_int<<endl;    //与上面等价,打印数组第一个元素的地址    
  50.     return 0;  
  51. }  
 

代码注释从代码运行结果得到,从代码注释来分析:

1.在main()中,arr等价于&arr; 而在fun()和fun2中,ca不等价与&ca。原因就是上面说的:在声明ca这个参数的函数fun的整个作用域内,数组名就是指针,ca是指针,&ca就是指针的地址;而在main中,arr是数组名,arr和&arr都是数组第一元素的地址。

从而导致:fun函数中的printf("%x/n",&ca); 打印出数组第一个元素的地址的地址;而main函数中的printf("%x/n",&arr);打印出数组第一个元素的地址。

2.任何时候,当数组是字符串数组时,使用printf和cout打印字符串,只要打印的内容是数组某个元素的地址,即可打印出以这个元素开始的整个字符串。

例如:fun函数中:printf("%s/n",&(ca[0]));cout<<"&(ca[1]) = "<<&(ca[1]);

而当数组不是字符串数组时,当打印的内容是数组某个元素的地址时,打印的就是实际的地址。

 

补充:sizeof(数组名),得到的是整个数组的长度。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值