-5
#include<stdio.h>
void main()
{
  int *c=12345;
  printf("dec:%d  hex:%x", c ,&c); // (1)
 }

第 (1) 行打印

dec:12345  hex:8af123

8af123显然地址是随机的和机器相关的。

当我投入

printf("dec:%d", *c); // (1)

显然,它失败了。

所以我的问题是按照理论概念:

  • *c应该持有价值12345,但事实并非如此。为什么?

在这段代码中:

#include<stdio.h>  
void main()  
{  
  char *c='a';  
  printf("address store in c:%d  value point by c:%c address of c:%x", c,*c ,&c); //Focus line  
}  

输出是:

adderess store in c:9105699 value point by c:a address of c:8af564
  • 为什么将“a”存储在*c而不是存储在c

我正在使用 gcc 编译器 4.4.3。

4

2 回答 2

11
int *c=12345;

您刚刚创建了一个指向(可能)无效地址的指针12345

如果您将c(no *) 传递给printf,则您正在传递指针本身。因此,printf只需看到 number12345并打印出来。它无法知道那应该是一个指针。

如果你传递*c, to printf,你将取消对指针的引用——你传递的是内存地址处的值12345
由于这不是一个有效的地址,因此取消引用操作将在到达printf.

于 2013-05-21T13:36:48.607 回答
2

所以我的问题是根据理论概念*str保持价值12345,但事实并非如此。为什么? 

int *c=12345; 

是相同的:

int *c;
c=12345;

它与以下内容不同

int *c;
*c=12345;

这里的 C 语言有一个语义怪癖。*属于声明,但它仅适用于该特定变量。

您可以通过将其放在数据类型旁边来阐明*属于声明的事实:

int* c = 12345;  // Don't format your declaration like this,
                 // see next example as to why

如果这样做,在同一语句中声明多个变量时会遇到麻烦:

int* a, b, c; // a is a pointer to int, b and c are plain int

// it is the same as:
int *a; int b; int c;

// and **not**
int *a; int *b; int *c;

所以,你只需要知道*属于声明。这不会引起任何问题,因为*c除非您首先将有效地址分配给c.

为什么它将'a'存储在* c而不是c中?

  char *c='a';  
  printf("%d  %c %x", c,*c ,&c); //Focus line  

您正在声明一个指向 char 的指针,该指针指向内存位置 97(的 ascii 值为a97)。然后您尝试将指针打印为数字(应该打印97,但见下文),内存位置 97 的值作为字符 (c在此阶段是无效指针,因此结果未定义,并且指针的地址c(c是位于堆栈上的 aout 变量)。

当我编译这段代码时,我得到一个警告:初始化使指针从整数而不是在分配97给字符指针时进行强制转换c。当我在 cygwin 中运行此代码时,我从未定义的行为中得到了分段错误。

于 2013-05-21T14:30:48.950 回答