原文:http://blog.csdn.net/microsues/article/details/6112898
在《Expert C Programming》这本书中,第202页有这样一句话:在函数参数的声明中,数组名被编译器当着指向该数组第一个元素的指针。通过实例测试,这句话的意思就是:在声明这个参数的整个函数作用域内,数组名就是指针。
见测试用例:
- #include<iostream>
- #include<stdio.h>
- using namespace std;
- void fun(char ca[])
- {
- printf("%x/n",ca); //打印数组第一个元素的地址
- printf("%x/n",&ca); //打印的数组第一个元素的地址的地址
- printf("%s/n",ca); //打印字符串
- printf("%s/n",&ca); //乱码
- printf("%x/n",&(ca[0])); //打印数组第一个元素的地址
- printf("%s/n",&(ca[0])); //打印字符串
- //主要cout和printf的区别.
- cout<<"ca = "<<ca<<endl; //打印字符串
- cout<<"&ca = "<<&ca<<endl; //打印的数组第一个元素的地址的地址
- cout<<"&(ca[0]) = "<<&(ca[0])<<endl; //从第一个元素开始打印字符串
- cout<<"&(ca[1]) = "<<&(ca[1])<<endl; //从第二个元素开始打印字符串
- }
- void fun2(int ca[])
- {
- printf("%x/n",ca); //打印数组第一个元素的地址
- printf("%x/n",&ca); //打印数组第一个元素的地址的地址
- printf("%x/n",&(ca[0])); //打印数组第一个元素的地址
- printf("%x/n",&(ca[1])); //打印数组第一个元素的地址
- //与主函数中的打印有啥区别??
- cout<<"ca = "<<ca<<endl; //打印数组的第一个元素的地址
- cout<<"&ca = "<<&ca<<endl; //打印的数组第一个元素的地址的地址
- cout<<"&(ca[0]) = "<<&(ca[0])<<endl; //打印数组的第一个元素的地址
- cout<<"&(ca[1]) = "<<&(ca[1])<<endl; //打印数组的第二个元素的地址
- }
- int main()
- {
- char arr[9] = "abcdefg";
- // char arr[9] = {'a','b','c','d','e','f','g'};
- cout<<endl<<"############ test fun ############"<<endl;
- fun(arr);
- int arr_int[9] = {1,2,3,4,5,6,7};
- cout<<endl<<"############ test fun2 ############"<<endl;
- fun2(arr_int);
- cout<<endl<<"############ test main ############"<<endl;
- printf("%x/n",arr); //打印数组第一个元素的地址
- printf("%x/n",&arr); //与上面等价,打印数组第一个元素的地址
- cout<<"arr = "<<arr<<endl; //为什么输出的是字符串,而不是地址
- cout<<"&arr = "<<&arr<<endl; //打印字符串的首地址
- printf("%s/n",arr); //打印字符串
- printf("%s/n",&arr); // 与上面等价,打印字符串
- cout<<endl;
- cout<<"arr_int = "<<arr_int<<endl; //打印数组第一个元素的地址
- cout<<"&arr_int = "<<&arr_int<<endl; //与上面等价,打印数组第一个元素的地址
- return 0;
- }
代码注释从代码运行结果得到,从代码注释来分析:
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(数组名),得到的是整个数组的长度。