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);

  通过“&”运算符取数组的地址,数组变量取的也是数组本身的地址;指针变量取到的是数组的地址,而通过“&”运算符指针变量取到的是指针变量值存储的地址(数组地址的地址)

  计算机不会为数组变量分配内存,所以不能将它指向别的地方;但计算机是会为指针变量分配空间的

 

posted @ 2016-04-01 11:51  高效养猪倌  阅读(431)  评论(2编辑  收藏  举报