C语言学习004:数组与指针
在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的
由于C语言并不知道数组有多长,所以用"\0"表示字符串的结束位置,通过sizeof运算符可以取到字符串在内存中占用多少个字节
同样的字符串在下面的代码中获取的长度却不一样,你知道是什么原因么?
#include <stdio.h> void SayHello(char msg[]){ printf("msg occupies: %i\n",sizeof(msg)); } int main(){ printf("Shatner occupies: %i\n",sizeof("Shatner")); char msg[]="Hello C"; printf("msg occupies: %i\n",sizeof(msg)); SayHello(msg); char* msgp=msg; printf("msgp occupies: %i\n",sizeof(msgp)); return 0; }
1 void SayHello(char msg[]){//如果把函数参数声明为数组,它会被当作指针处理,所以这里的msg其实是指针变量 2 printf("msg occupies: %i\n",sizeof(msg));//所以sizeof获取的是指针的长度 3 } 4 5 int main(){ 6 printf("Shatner occupies: %i\n",sizeof("Shatner")); 7 char msg[]="Hello C";//计算机会为字符串的每个字符以及结束字符"\0"在栈上分配空间,并把首字符地址和msg关联起来, 8 printf("msg occupies: %i\n",sizeof(msg)); 9 SayHello(msg);//数组可以当指针来使用 10 char* msgp=msg; 11 printf("msgp occupies: %i\n",sizeof(msgp));//这里当然也是获取的是指针的长度 12 return 0; 13 }
数组与指针的区别
在上面的代码中我们也看到sizeof(数组)与sizeof(指针)得到的结果是不同的,sizeof(数组)得的是数组的大小而sizeof(指针)得到的是指针在操作系统中所占的大小(在32位中是4,在64位中是8);
通过“&”运算符取数组的地址,数组变量取的也是数组本身的地址;指针变量取到的是数组的地址,而通过“&”运算符指针变量取到的是指针变量值存储的地址(数组地址的地址)
计算机不会为数组变量分配内存,所以不能将它指向别的地方;但计算机是会为指针变量分配空间的