C 指针变量存储什么?
我输入了以下代码:C 指针变量存储什么?,c,pointers,C,Pointers,我输入了以下代码: char *a; char b = 'd'; a = b; printf("%c", a); 输出-‘d’ 我的问题是,由于a是指针变量,所以它应该存储地址。在这种情况下,它为什么存储字符值 因为a是指针变量,所以它应该存储地址 指针变量也可以存储数值。在大多数系统上,指针变量可以存储int,尽管没有明确的保证。但是,指针变量能够在所有系统上存储char类型的值 那么,在这种情况下,它为什么要存储字符值呢 因为是你让它这么做的。将值存储在指针中不会使该值成为地址 注意:您的
char *a;
char b = 'd';
a = b;
printf("%c", a);
输出-‘d’
我的问题是,由于a
是指针变量,所以它应该存储地址。在这种情况下,它为什么存储字符值
因为a
是指针变量,所以它应该存储地址
指针变量也可以存储数值。在大多数系统上,指针变量可以存储int
,尽管没有明确的保证。但是,指针变量能够在所有系统上存储char
类型的值
那么,在这种情况下,它为什么要存储字符值呢
因为是你让它这么做的。将值存储在指针中不会使该值成为地址
注意:您的代码具有未定义的行为。代码生成预期输出的原因是系统上的指针表示形式恰好与
int
的指针表示形式兼容,这就是%c
所期望的。指针是一个存储另一个变量地址的变量。但在这里,您编写了a=b,这意味着您提供了a将存储的字符d。这是因为指针也是一个变量。它也有自己的地址空间。而我们提供了另一个变量的地址变量指针存储该地址,这意味着指针具有存储容量。但是在这个程序中,你不能取消对指针的引用。你会得到分段错误。在引用C时,指针变量存储它所指向的变量的地址在C语言中,我们不能像任何其他普通变量那样使用它来存储其他类型的数据。此外,指针变量的数据类型是指向的变量,或者如果我们将其声明为void,我们需要根据需要将其强制转换(即指向变量的数据类型)
参考您的查询,因为您已经将其声明为“指针变量”,所以“printf”的功能是打印指针变量所指向的数据。尽管您的代码输出似乎是基于所述原因工作的,将
char
分配给char*
是不正确的做法。编译器(GCC 4.8.4)警告也有助于理解问题:
warning: assignment makes pointer from integer without a cast [enabled by default]
a = b;
^
当您将
int
分配给int*
时,编译器将打印此类警告。它也同样适用于char
和char*
,因为char
在C中是int
的一种形式。您刚刚将指针值更改为a的ascii值。您的编译器至少应该抱怨分配;将整数值指定给指针对象是违反约束的行为。请注意,gcc还抱怨printf
语句,因为a
(char*
)的类型不是%c
转换说明符所期望的(char
)。不,我的gnu gcc编译器中没有警告或错误更多问题。“指针变量中只能存储变量的地址”这句话正确吗?我在书中读到了,回答得很好。。。唯一缺少的是b
的地址写为&b
(例如,“也许你想写a=&b;
?”…)。此外,由于OP对这一点感到困惑,他用来学习的任何资源显然都不起作用,他可能应该尝试K&R2e…更正:如果你要提出这一点,你可能还想提出%p
。。。要学的东西这么多,书这么少……我正在使用E Balaguruswamy的ANSIC。我想写的是b,不是&b。我知道两者的区别。还有一个问题。“指针变量中只能存储变量的地址”这句话正确吗?我在书中读到过。@AkhilRaj这本书把事情简化了一点,因为指针也可以保存数值。从C99开始,甚至有一些特殊类型可用于以标准兼容方式将指针转换为整型或从整型转换为整型,即intptr\t
和uintptr\t
。然而,由于很少有人需要这种功能,我不会责怪本书的作者没有提到这种模糊的功能。