来自知乎 https://www.zhihu.com/question/26117197
问题
具体来说,下面这些情况让我感到疑惑:
-
既然 char *a 只是定义了一个指针 a,而并不为其指向的字符串分配内存,那么为什么下面两行代码又能够编译通过,且执行结果看上去是正常的?
char *a;
a = “abcde”;
这两行程序的执行过程中,编译器/计算机都做了些什么?
在这两行程序的基础上,为什么赋值语句 *a = ‘A’ 又是不合法的(会导致运行时错误)?
相比于上面两行程序,以下两行也是不合法的,为什么?
char a[];
a = “abcde”; -
以下两种初始化方式是否有本质区别?
char a[] = “abcde”;
char *b = “abcde”; -
为什么下面的代码
char *a, *b;
a = “abcde”; b = “abcde”;
其运行结果中, a 和 b 会指向同一内存地址?而上一问中得到的 a 和 b 就不会指向同一内存地址。 -
对于数组声明(或初始化)的变量,例如
char a[6];
或
char a[]=“abcde”;
这句话是否正确?当 a 作为右值(rvalue)时,其类型为 char*;而当 a 作为左值(lvalue)时,其类型就是 char[6]。