繁体   English   中英

C指针地址打印

[英]C pointer address printing

我第一次学习 C 指针和地址以及如何在我的平板电脑上使用它们

让我们说:

int x = 1, y = 2;

int *ip; // declares *ip as an int type?

ip = &x; //assigns the address of x to ip?

y = *ip; //y is now 1 via dereferencing

所有的评论解释都正确吗?

如果我打印 ip 的结果会发生什么? 它会打印变量 x 的地址,比如

011001110

是的。 你的所有陈述都是正确的。 但是在第一个的情况下

int *ip;

最好说ip是一个指向int类型的指针。

如果我打印 ip 的结果会发生什么?

它将打印x的地址。

它会打印变量 x 的地址,比如

011001110

否。地址通常以十六进制表示。 您应该使用%p说明符来打印地址。

printf("Address of x is %p\n", (void *)ip);  

笔记:
请注意,在上面的声明中*不是间接运算符。 相反,它指定p的类型,告诉编译器p是一个指向int指针 *符号仅在出现在语句中时才执行间接操作。

int x = 1, y = 2;

int *ip; // declares ip as a pointer to an int (holds an address of an int)

ip = &x; // ip now holds the address of x

y = *ip; // y now equals the value held at the address in ip

以以下为例:

Initializer       x        y        ip
Memory Value      [1]      [2]      [1000]
Memory Address    1000     1004     1008

如你看到的:

  1. x的值为1 ,地址为1000
  2. y的值为2 ,地址为1004
  3. ip的值为1000x的地址)和地址1008

考虑以下:

  1. x == 1&x == 1000
  2. y == 2&y == 1004
  3. ip == 1000&ip == 1008*ip == 1x的值)

希望这可以帮助您想象正在发生的事情。

都是对的。

第一行:声明两个变量

第二行:定义了内存指针“ip”

第 3 行:将 X 的内存地址赋予指针 ip

第 4 行:Y 现在设置为地址 ip 处的变量 X 的值

但是,内存地址是十六进制格式。 011001110 是一个字节的数据,而不是一个内存地址。 该地址更有可能类似于 0x000000000022FE38(可能更短)。 考虑一下:

int x = 0;
int *ptr = &x; //the "&" character means "the address of"
printf("The variable X is at 0x%p and has the value of %i", (void *)ptr, x);

这将打印 X 的地址,而不是 *ptr。 您需要另一个指针来打印 *ptr 的地址。 但这毫无意义,因为定义了一个指针来打印变量的地址。 将其视为另一个变量的别名(它的值是该内存地址处的值)。

我喜欢原始海报的声明,即*ip是一个int 这准确地反映了声明的语义,其中声明符*ip是一个表达式,声明说明符(在本例中为int )提供表达式的类型。 以这种方式说明含义可以深入了解诸如int *ip, q;类的东西的含义int *ip, q; 其中q只是一个int 您可能不想在对话中使用这种更正式的方式来说明类型,但它有助于查看声明所表达的底层结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM