例如,下面我刚开始使用下面的代码处理指针。
#include<stdio.h>
int main(){
int x = 3;
int y = 7;
int *ip; //creating int pointer ip
ip = &x; // ip storing the address of x
printf("Address of x: %d\n", ip);
*ip = 5;
printf("Address of x: %d\n", ip);
ip = &y; // ip also storing the address of y
printf("Address of y: %d\n", ip);
*ip += 11;
x += *ip;
printf("%d\n", x); // value is 23
printf("%d\n", y); // value is 18
printf("%d\n", *ip); // value is 18
}
代码运行正常,我想知道为什么。我在想指针开始保存变量y
的地址之后,由于指针不再指向该地址,因此使用指针指向x
时所做的更改应该被还原。
答案 0 :(得分:3)
单个指针能否指向两个或多个变量
不,单个指针只能指向一件事。那东西可能是int
,数组(或数组的元素)或其他东西。
但是,从那时起,您可以使用指针并使其指向其他对象!就像其他int
或数组的其他元素一样。
您已经使用=
赋值运算符完成了此操作:
ip = &y;
现在,它不再指向x
;它指向y
。
我在考虑指针开始保存变量y的地址后,由于指向x的指针不再保存该地址,因此使用该指针所做的更改应该被还原。
这是对指针功能的误解。指针不存储您通过它进行的分配。它甚至都不知道它们。这不是一个掩码,它会暂时掩盖现有对象的值,该值只能在指针与该对象相关的持续时间内才能观察到。这是一个指针。它指向事物。
它所做的只是提供对x
(及以后的y
)的访问。而已。期。您对x
(及以后的y
)所做的一切都在您和x
(及以后的y
)之间。以后重新绑定指针绝对不会对这些操作产生“撤消”作用。
为什么代码有效?因为您遵循了语言规则并编写了有效的程序。
答案 1 :(得分:1)
指针是一个值的引用,就像房间号一样。
'<API><Result><ErrorCode ErrorType=\"Success\">0</ErrorCode<ReturnCode>0</ReturnCode></Result><API>'
表示ip是房间号。
int *ip;
表示ip = &x;
是现在的房间数ip
。
x
表示将*ip = 5;
设置在房间中,编号为5
,x = 5;
x
更改ip = &y;
是现在ip
的房间数。
很明显,您在y
和printf("x's address is %x, y's address is %x, ip is %x\n", &x, &y, ip)
语句中加入了ip = &x;
。
答案 2 :(得分:-1)
<h5>Two paragraphs will have no border</h5>
<div>
<p>haha</p>
<p>hoho</p>
</div>
<br/>
<h5>Three or more paragraphs will have a border</h5>
<div>
<p>haha</p>
<p>hoho</p>
<p>haha</p>
<p>hoho</p>
</div>
将x的地址存储为ip的值,然后存储其他人的可变地址。但是,为什么需要指针?如果确实如此,您是否考虑过智能指针?