c语言的一个小问题

代码如下:

#include <stdio.h>

int main(int argc, char *argv[]) {
    char str1[] = "gaga";
    char *str2  = "gaga";

    printf("str1:%d\nstr2:%d\n",
         sizeof(str1),
         sizeof(str2));

    return 0;
}

运行结果:

str1:5
str2:4

看Learn c the hard way时提到定义上述两种方法都可以定义字符串。不过这里看出结果是不一样的。两个变量的大小不同,str2是一个char*没错吧。。。str1是个字符数组,不是说数组名本身就是指向第一个元素的指针么?应该和str2类型相同吧?为什么是这个结果,求解。

阅读 3.8k
3 个回答

ok...又是一次自问自答...我错了。。。 看到了第15章讲指针,解答了这个问题。“数组名是指向第一个元素的指针”这个说法是错的。亏我上课听那么认真。。老师居然就这样敷衍过去了。。。

Pointers Are Not Arrays

No matter what, you should never think that pointers and arrays are the same thing. They are not the same thing, even though C lets you work with them in many of the same ways. For example, if you do sizeof(cur_age) in the code above, you would get the size of the pointer, not the size of what it points at. If you want the size of the full array, you have to use the array's name, age as I did on line 12.

指针不是数组

不管怎样,你都不该把指针和数组当成同一个东西,他们不一样,即使c语言中你可以用很多相同的方式操作他们。举个例子吧,如果你在上面的代码中执行sizeof(cur_age)(呃。。好熟悉 - -!),你会得到指针的大小,不是它所指向的东西的大小。如果你需要整个数组的大小,你必须使用数组的名字——比如age,就像我在第12行做的一样。

Learn c the hard way 第15章的链接

提示一下,尽量不要写 char* str ="hello";这种代码。

str1定义完以后,str1本身存储了该数组的首字符的指针地址,但是str1本身还是一个数组,不是一个指针。你如果需要获得该指针,需要显示的定义指针,然后赋予该指针str1的值,参考如下代码:

    // m声明完后,m存储了m数组第一个字符的地址,但m并不是指针
    char m[] = "abcdef";
    // 才是指针,该指针的地址为m的值
    char *x = m;
    // 这种方式是将上面两步合二为一,则n就代表了指向数组的第一个未知的指针
    char *n = "abcdef";

    // 数组m的长度
    printf("%d\n", sizeof(m));
    // 指针x的长度
    printf("%d\n", sizeof(x));
    // 指针n的长度
    printf("%d\n", sizeof(n));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
101 新手上路
子站问答
访问
宣传栏