这一段程序
下面这段程序很有看点:
//arr1 is an array of ints
int *source=arr1;
size_t sz=sizeof(arr1)/sizeof(*arr1);//number of elements
int *dest=new int[sz];
while(source!=arr1+sz)
*dest++=*source++;//copy element and increment pointers
1.source是一个指向数组arr1的第一个元素的指针.(开始时,*source与*arr1的值是一样的.)
2.sizeof操作符的作用是返回一个对象或类型名的长度,返回值类型为size_t,长度的单位是字节.
3.对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数.因为sizeof返回整个数组在内存中的存储长度.
4.sizeof(*arr1),对指针arr1做sizeof操作,返回arr1所指的数组的第一个int型元素的类型长度.在这里,下面三种写法是等效的:
sizeof(*arr1)=sizeof(*source)=sizeof(int)
5.source!=arr+sz,这里是在比较地址(没有解引用),这里的数组名arr就自动转化成了指向数组第一个元素的指针,加几就指向其后面的第几个元素.
6.比较sizeof(arr1)和sizeof(*arr1).arr1不解引用做sizeof操作,编译器能判断出来这就是一个普通的指针还是一个数组名指针,如果这是个数组名,就返回整个数组在内存中的存储长度,否则就返回存放指针所需的内存大小,比如指针p里存放的地址是0x22ff50,那么存放这个地址需要4字节,则sizeof(p)返回4.而对于*arr1,这里arr1只是一个普通的指针.
-------------------------------
猜想
继续研究上面的第六点,写了这样一段测试程序:
char a[7]={'1','2','3','4','5','6','7'};
char *b=&a[0];
char *c=a;
cout<<sizeof(a)<<endl;
cout<<sizeof(a+2)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
输出的结果为:
7
4
4
4
那么,我想,或许真有数组名指针这种东西,也就是说指针a上可能有某种记号表明它是一个数组名,这种标志是数组创建的时候产生的,另一种可能就是指针a和7个数组元素存放的地址存在某种特殊联系.