我第一次学习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
答案 0 :(得分:29)
是。你的所有陈述都是正确的。但是在第一次
的情况下int *ip;
最好说ip
是指向int
类型的指针。
如果我打印ip的结果会怎么样?
它将打印x
的地址。
它会打印变量x的地址吗,比如
011001110
没有。地址通常以十六进制表示。您应该使用%p
说明符来打印地址。
printf("Address of x is %p\n", (void *)ip);
注意:强>
请注意,在上面的声明中*
不是间接运算符。相反,它指定p
的类型,告诉编译器p
是指向int
的指针。 *
符号仅在出现在语句中时执行间接。
答案 1 :(得分:3)
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
答案 2 :(得分:2)
以下面的例子为例:
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
的值)希望这可以帮助您直观地了解正在发生的事情。
答案 3 :(得分:0)
一切都正确。
第1行:您声明了两个变量
第二行:内存指针" 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的地址。但这是毫无意义的,因为指针被定义为打印变量的地址。可以将其视为另一个变量的别名(它的值是该内存地址的值)。
答案 4 :(得分:0)
我喜欢原始发帖人的说法,即*ip
是int
。这可以准确反映声明的语义,其中声明符*ip
是一个表达式,而声明说明符(在这种情况下为int
)提供了表达式的类型。通过这种方式说明含义可以深入了解int *ip, q;
之类的含义,其中q
只是int
。您可能不希望使用这种更正式的方式来说明对话中的类型,但有助于查看声明所表示的基础结构。