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数组,则输出首地址。这并不是说这两种数组有什么不一样,只是<<操作符对不同类型数组的重载而已。