[英]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
如你看到的:
x
的值为1
,地址为1000
y
的值为2
,地址为1004
ip
的值为1000
( x
的地址)和地址1008
考虑以下:
x == 1
和&x == 1000
y == 2
和&y == 1004
ip == 1000
和&ip == 1008
和*ip == 1
( x
的值)希望这可以帮助您想象正在发生的事情。
都是对的。
第一行:声明两个变量
第二行:定义了内存指针“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.