如何操作C指针

时间:2014-04-17 09:31:21

标签: c string pointers char memory-address

我不擅长指针。

这是指针的示例程序

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

有人告诉我为什么ab显示c的相同值时没有显示任何值?

a如何显示c的相同值?

5 个答案:

答案 0 :(得分:2)

a是一个未初始化的变量,没有任何值。

b是一个未初始化的变量,没有任何值。

c是一个未初始化的变量,没有任何值。

C中有&*的特殊规则:如果语法正确,则&*不执行任何操作。因此&*cc相同。 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的值是垃圾。 取消引用未初始化的指针是未定义的行为。未定义的行为意味着不可预测的行为。即使它似乎工作,任何事情都可能发生从程序崩溃到您的硬盘格式化。因此,对于调用未定义行为的代码没有任何意义。该标准对处理此类案件的实施没有要求,您应该始终避免这些案例。

阅读这些 -

  1. Common undefined behaviour
  2. Undefined behaviour and sequence points

答案 2 :(得分:1)

您的代码有未定义的行为。

答案 3 :(得分:1)

将一个char指针赋给c,它是char指针的指针。这里有不同级别的指针,你的警告也是如此。取&*c与C中的c相同。

因此,当您执行行c处的字符串而不是地址*c(这是" abcd"的实际地址) >

printf("a = %s\n",a);

答案 4 :(得分:1)

首先,a = &*cb = &*c是非法指针转换,因此您可能需要a = *c。其次,在初始化*c之前,您无法将a分配给*c = "abcd"; a = *c; b = *c; 。因此,这是合法的:

char **a = c;
*c = "abcd";

这也是合法的:

{{1}}