分类: C/C++
2013-08-05 15:05:20
对于一个数组 int a[5]; a表示数组首元素的地址,而&a表示数组的首地址。
假设 &a[0]的地址为0x00ffff00;则&a[4]的地址为0x00ffff12; 那么&a+1 的地址为数组的首地址加上该数组的偏移量sizeof(a)(20),a+1 则是数组首元素的地址加上该数组一个元素的偏移量sizeof(a[0])(4)。
上面的都应该明白了吧,下面请看
#include "stdafx.h"
int main(int argc, char* argv[])
{
char a[5]={'A','B','C','D','E'};
char (*p1)[5]=&a;
char (*p2)[5]=a;
return 0;
}
这个你怎样理解?那个是正确的?
(*p)[5]表示p是一个指向含有5个元素的指针变量。
对于char (*p1)[5]=&a; 是把&a的地址赋给指针变量p1(p1是有内存的,它里面保存了指向数组的地址),这里类型相同(都是含有5个元素的数组首地址),若此句改为char (*p1)[3]=&a; 或者char (*p1)[10]=&a; 都会报错,因为所包含的严肃个数不同,我认为即 字节数不同,只有包含的元素相同才能赋值操作,当然这要是在指向内存里存的值得类型一样的前提下。
从上面的分析自然就知道char (*p2)[5]=a;这句是错的了,一个是 char *[5] 一个是 char [5]。(a是sizeof(a)空间的名字)