我不擅长指针。
这是指针的示例程序
int sample(){
char* a;
char* b;
char* *c;
a = &*c;
b = &*c;
*c = "abcd";
printf("a = %s\n",a);
printf("b = %s\n",b);
printf("c = %s\n",*c);
return 0;
}
编译时会发出警告。
warning: assignment from incompatible pointer type
结果如下。
a =
b = abcd
c = abcd
有人告诉我为什么a
在b
显示c
的相同值时没有显示任何值?
a
如何显示c
的相同值?
答案 0 :(得分:2)
a
是一个未初始化的变量,没有任何值。
b
是一个未初始化的变量,没有任何值。
c
是一个未初始化的变量,没有任何值。
C中有&*
的特殊规则:如果语法正确,则&*
不执行任何操作。因此&*c
与c
相同。 c
的类型与a
的类型不同,因此分配是非法的。与b
的作业相同。具有正确设置的好编译器或编译器拒绝编译而不是给出警告。
*c = "abcd"
:由于c
是未初始化的变量,因此分配给*c
是未定义的行为。如果你很幸运,你的程序会崩溃。如果您不幸运,它可以在您的开发机器上运行,并在客户使用该软件时崩溃并造成严重损坏。
答案 1 :(得分:2)
char *a;
上述语句将a
定义为指向字符的指针,即它可以存储字符的地址。
char **c;
上述语句将c
定义为指向字符的指针,即它可以存储指向字符类型的指针的地址,即char *
变量。
a = &*c;
// equivalent to
a = &(*c)
// equivalent to
a = c;
c
的类型为char **
,其中a
的类型为char *
- 另一种类型。 这些类型是不兼容的类型,用于解释警告消息 -
warning: assignment from incompatible pointer type
变量c
是单元化的,这意味着它包含垃圾值,即它的值是不确定的。
*c = "abcd";
上述语句表示指向字符串文字"abcd"
的第一个字符的指针存储在c
指向的位置,但c
的值是垃圾。 取消引用未初始化的指针是未定义的行为。未定义的行为意味着不可预测的行为。即使它似乎工作,任何事情都可能发生从程序崩溃到您的硬盘格式化。因此,对于调用未定义行为的代码没有任何意义。该标准对处理此类案件的实施没有要求,您应该始终避免这些案例。
阅读这些 -
答案 2 :(得分:1)
您的代码有未定义的行为。
答案 3 :(得分:1)
将一个char指针赋给c,它是char指针的指针。这里有不同级别的指针,你的警告也是如此。取&*c
与C中的c
相同。
因此,当您执行行
c处的字符串而不是地址*c
(这是" abcd"的实际地址) >
printf("a = %s\n",a);
答案 4 :(得分:1)
首先,a = &*c
和b = &*c
是非法指针转换,因此您可能需要a = *c
。其次,在初始化*c
之前,您无法将a
分配给*c = "abcd";
a = *c;
b = *c;
。因此,这是合法的:
char **a = c;
*c = "abcd";
这也是合法的:
{{1}}