以前已经都提过了, c语言中,数组名就是1个指向数组第1个元素地址的指针.
如数组char a[] = "bcd";
数组名a 就是指向数组a[]的第1个元素a[0]的地址
所以*a==a[0]=='b'
当我们定义1个新的指针p,并给它赋值时:
p=a;
一般来讲我们认为他们p与a是等价的
因为同样有: *p==p[0]='b'
p[i]=a[i]
但是有特殊情况, 要将数组名a看成1个特殊的指针.
例如函数sizeof , 这是取1个对象(变量or常量) 的内存占用空间
举个例子:
定个1个字符数组c:
char c[]="abcdefghikjlmn";
那么sizeof(c) 得出的是 数组c的所占内存空间,也就是c所有元素占的长度(包括最后的隐藏元素'\000').
所以
sizeof(c) == 15 //因为c是字符数组, 每1个字符占的长度是1字节(byte)啦
跟着定义1个指针p,并赋值:
p=c;
而size(p) 是求p本身所占的内存空间, 也就是1个内存单位
sizeof(p) == 8 // 64位gcc, 32位gcc是4, 因为对于每1个内存单位来讲,64位的内存单位长度是32位的一倍.
那么数组c 是不是容易都是特殊指针呢. 不是, 当他作为1个参数被传入时, 系统会将这个参数转为一般化指针:
例如我定义1个新函数:
long int getlen(char* a){
return sizeof(a);
}
执行 getlen(c) 时, 实际是也会执行 size(c), 但是因为这时数组名c作为参数已经被转为一般的函数, 所以getlen函数里面的sizeof(c)求的是c指针本身所占的内存空间, 也就是8啦.
见如下例子:
输出:
如数组char a[] = "bcd";
数组名a 就是指向数组a[]的第1个元素a[0]的地址
所以*a==a[0]=='b'
当我们定义1个新的指针p,并给它赋值时:
p=a;
一般来讲我们认为他们p与a是等价的
因为同样有: *p==p[0]='b'
p[i]=a[i]
但是有特殊情况, 要将数组名a看成1个特殊的指针.
例如函数sizeof , 这是取1个对象(变量or常量) 的内存占用空间
举个例子:
定个1个字符数组c:
char c[]="abcdefghikjlmn";
那么sizeof(c) 得出的是 数组c的所占内存空间,也就是c所有元素占的长度(包括最后的隐藏元素'\000').
所以
sizeof(c) == 15 //因为c是字符数组, 每1个字符占的长度是1字节(byte)啦
跟着定义1个指针p,并赋值:
p=c;
而size(p) 是求p本身所占的内存空间, 也就是1个内存单位
sizeof(p) == 8 // 64位gcc, 32位gcc是4, 因为对于每1个内存单位来讲,64位的内存单位长度是32位的一倍.
那么数组c 是不是容易都是特殊指针呢. 不是, 当他作为1个参数被传入时, 系统会将这个参数转为一般化指针:
例如我定义1个新函数:
long int getlen(char* a){
return sizeof(a);
}
执行 getlen(c) 时, 实际是也会执行 size(c), 但是因为这时数组名c作为参数已经被转为一般的函数, 所以getlen函数里面的sizeof(c)求的是c指针本身所占的内存空间, 也就是8啦.
见如下例子:
输出:
下面这个是相同代码在32位gcc环境下的输出: