我正在学习C编程,我对指针有一个简单的问题......
我使用以下代码来使用指针:
#include <stdio.h>
int main (int argc, const char * argv[]) {
int * c;
printf("%x\n",c);
return 0;
}
当我打印C的值时,我返回0.但是,当我打印&amp; c(即printf(“&amp; x \ n”,&amp; c)时,我在内存中得到一个地址......
打印指针时,我不应该在内存中获取地址(即printf(“%x \ n”,c)?
--- 编辑 ---
#include <stdio.h>
#include <stdlib.h>
int main (int argc, const char * argv[]) {
char * a = malloc(11);
printf("String please\n");
scanf("%s",a);
printf("%s",a);
}
问题是,为什么printf(“%s”,a)返回字符串而不是存储在?
中的地址我不应该使用* a来跟踪指针然后打印字符串吗?
答案 0 :(得分:11)
您当前的程序不正确。您在第一次使用之前定义变量并且不设置值。 c
不保证初始值,但您很幸运,它等于0
。这意味着c
无处可指。当您打印&c
时,您打印变量c
本身的地址。实际上两个版本都打印地址。
答案 1 :(得分:1)
printf实际上是一个非常复杂的功能,可以通过为它提供正确的格式说明符来做各种技巧。
在你的字符串示例中:
printf("%s", a)
“%s”告诉printf函数应将以下变量视为字符串。在C中,字符串是指向一个或多个char的指针,由包含0的char终止。这是一个非常常见的请求,这就是printf支持触发这种相对复杂行为的格式说明符“%s”的原因。如果要打印字符串指针中包含的地址,则必须使用之前找到的格式:
printf("%x\n",a);
告诉printf将a的内容视为无符号整数,并将其打印在16中。
* a只是a指向的值,它只是一个字符。
您可以使用
打印单个字符printf("%c", *a);
答案 2 :(得分:0)
有int * c;如果打印c的值,则返回一个应该被解释为整数值的内存地址的值。在您的示例中,它可能是0或完全不同的东西,因为您没有初始化c。
如果你打印&amp; c你得到指针c的存储器地址(存储在堆栈中)。
答案 3 :(得分:0)
#include <stdio.h>
int main (int argc, const char * argv[]) {
int * c;
int a=10;
c = &a;
printf("%x\n",c);
return 0;
}
这可能会澄清当你将int指针指向内存中的内容时会发生什么。