学习C - 指针和内存寻址

时间:2010-07-18 16:52:56

标签: c pointers

我正在学习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来跟踪指针然后打印字符串吗?

4 个答案:

答案 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指针指向内存中的内容时会发生什么。