这是关于指针的基本C程序:
sed -e "s/^M//" filename > newfilename
这会产生以下输出:
#include <stdio.h>
int main() {
int variable = 20;
int *pointerToVariable;
pointerToVariable = &variable;
printf("Address of variable: %x\n", &variable);
printf("Address of variable: %x\n", pointerToVariable);
printf("Address of variable: %x\n", *pointerToVariable); // * is the DEREFERENCING OPERATOR/INDIRECTION OPERATOR in C.
//It gives the value stored at the memory address
//stored in the variable which is its operand.
getchar();
return 0;
}
但是Address of variable: 8ffbe4
Address of variable: 8ffbe4
Address of variable: 14
应该打印20,不应该吗?因为*pointerToVariable
给出了存储在其操作数中的内存地址的实际值,对吧?
我错过了什么?
答案 0 :(得分:1)
首先,
printf("Address of variable: %x\n", &variable);
printf("Address of variable: %x\n", pointerToVariable);
是错误的,因为您使用了错误的格式说明符导致undefined behavior。
要打印地址,您需要
%p
格式说明符(void *)
然后,
printf("Address of variable: %x\n", *pointerToVariable);
语句,%x
格式说明符打印所提供的整数值的十六进制表示,因此您在那里得到了正确的输出。
答案 1 :(得分:1)
14
是HEX
的{{1}}值。
将20
格式说明符更改为printf
而不是%d
,以%x
作为输出
20
此外,指针的正确格式说明符为printf("Address of variable: %d\n", *pointerToVariable);
,所以
%p
必须是
printf("Address of variable: %x\n", pointerToVariable);
答案 2 :(得分:1)
您的格式为十六进制(基数为16)(%x)此行:
printf("Address of variable: %x\n", *pointerToVariable);
//输出:14
如果您想要输出10,那么您需要提供正确的格式:
printf("Address of variable: %d\n", *pointerToVariable); // output : 20
// 1*16 + 4 = 20
祝你好运