C++笔记121029

数组名和指针

数组名不是指针,虽然它们太像了。

比如

#include <iostream>
using namespace std;

int main()
{
    int arr[bufSize]={0, 1, 2, 3, 4};
    int *p=arr; cout<<p[0]<<'\t'<<p[1]<<endl;for(size_t idx = 0; idx != bufSize; ++idx)cout<<*(arr+idx)<<'\t'<<endl;
    for(int *p = arr, *pend = arr+bufSize; p!= pend; ++p)cout<<*p<<'\t'<<endl;
 
return 0; }

以上这段代码,你基本上看不出数组名和指针有什么区别,他们都支持解引用、下标操作和加法运算(其实减法也支持)。

但是对于下面这一段

#include <iostream>
using namespace std;

int main()
{
    int a[10];
    int *p = a;
    cout<<sizeof(a)<<'\t'<<sizeof(p)<<endl;
    return 0;
}

显然会发现结果是40和4,说明数组明显不是指针。btw sizeof不是一个函数而是一个操作符。例如可以sizeof(int);

换言之,数组名指代数据结构。而指针是一种数据类型。但是数组名支持const指针的几乎一切操作,使得它看起来就像一个const指针。

另外,当数组名用于函数形参时,其数据结构的意义丧失,等价于一个指针,也就是说

void func(int arr[])
{
    //do sth with arr
}

void func(int *arr)
{
     //do sth with arr
}

上述两种写法几乎完全等价。在函数的形参过程中,由于形参被实参初始化,而数组名初始化int arr[]=只有列表初始化的方法,因此实际上传参时规定这个初始化按照指针规则初始化,所以第一种写法和第二种写法是等价的。这时arr在两种写法中都退化成一个指针。

 

最后说一句,如果写cout<<arrayName<<endl;这种句子,对于不同类型的数组得到不同结果并不奇怪,如果arrayName是一个字符数组,则按字符串形式输出,如果是int数组,则输出首地址。这并不是说这两种数组有什么不一样,只是<<操作符对不同类型数组的重载而已。

posted @ 2012-10-29 23:14  hilbertan  阅读(322)  评论(0编辑  收藏  举报