C 两个指针指向同一位置时出现问题
我不知道如何解决指针的问题。我的指针p指向内存中的某个地址。我想把指针q指向完全相同的地址。之后,我想将指针p指向NULL。问题是,在我这样做之后,指针q也指向NULL,但我希望他继续指向初始地址。有办法做到这一点吗?以下是我想做的简单代码:C 两个指针指向同一位置时出现问题,c,pointers,null,dereference,C,Pointers,Null,Dereference,我不知道如何解决指针的问题。我的指针p指向内存中的某个地址。我想把指针q指向完全相同的地址。之后,我想将指针p指向NULL。问题是,在我这样做之后,指针q也指向NULL,但我希望他继续指向初始地址。有办法做到这一点吗?以下是我想做的简单代码: int* p = &a; //pointer "p" now points to "a" int* q; q = p; //pointer "q" points to "a" as well *p = NULL; /
int* p = &a; //pointer "p" now points to "a"
int* q;
q = p; //pointer "q" points to "a" as well
*p = NULL; //pointer "p" points to NULL
printf("%d", *q); //pointer "q" points to NULL as well, but I want him to keep pointing to "a"
*p=NULL//指针“p”指向NULL
这是错误的,您取消引用p
,并将其设置为所引用的NULL
值
使用
p=NULL
问题在于:*p=NULL//指针“p”指向空值
您不是重置指针指向的位置,而是在引用位置设置值 举个例子:
*ptr = value // (writes the value to the memory location of ptr)
ptr = value // (changes the referenced memory location to value)
在代码中,p和q指向相同的内存位置。您没有将指针更改为其他位置,而是将p(也是q)所指的值覆盖为NULL 这应该行得通
int a = 5;
int* p = &a; //pointer "p" now points to "a"
int* q = &a;
p = q;
p = NULL; //pointer "p" points to NULL
printf("%d", *q);
代码中的问题是:
*p = NULL;
这样,您就可以取消对
p
的引用,并将NULL
的值写入a
,这在您的情况下是错误的NULL
是指被分配或与指针进行比较,而不是指针指向的对象(除非引用的对象,这里的a
,也是指针-())
解决方案:
您需要省略取消引用运算符(*
):
将NULL
分配给p
而不是a
更正代码():
*p=NULL//指针“p”指向空值
不,没有。取消引用此指针并将a
设置为转换为int
的NULL(通常为零)
如果要将p
设置为NULL,则需要p=NULL
如果您的想法是让p
引用q
指针,则需要将代码更改为:
int a = 5;
int* q = &a;
int **p;
p = &q;
*p = NULL; //now *p && q are NULL
*p=NULL代码>->p=NULL代码>我想5个完全相同的答案就足够了。:-)不要让语法像int*p=NULL代码>和*p=3代码>迷惑你。在声明中,*
看起来可能是给定值的对象的一部分,但事实并非如此。声明是特殊的,只有命名对象p
被赋予值,而不是*p
。在赋值中,左侧的整个表达式,*p=3
中的*p
被赋予一个值。因此,要将p
设置为NULL
,需要p=NULL代码>,而不是*p=NULL代码>.Re“否,它不存在”:是,它存在*p=NULL
将NULL
(转换为int
)放入*p
,并且p
指向*p
,因此p
随后指向NULL
(转换为int
)。人们不应该使用“指向空”这一短语。相反,它应该是“p
是一个空指针”或“p
不指向任何地方/什么都没有”。@EricPostpischil不,它没有。它指向整数值。此值可以转换为NULL,但不再为NULL<代码>考虑#定义空(void*)0
。NULL不是0
并且0
不是NULL为了教学,你需要了解其他人的想法。仅仅写出技术上真实的陈述,并期望学生在他们还不具备理解它们所需的知识时理解它们是不够的。一些学生会认为“我把NULL
放在*p
中,所以现在p
指向NULL
”,NULL
在这个作业中被转换成int
(转换成int
)这一事实可能不会阻止他们这样想。所以你必须解释;你必须处理他们头脑中的东西,而不仅仅是C标准中的内容。只要写出能在技术上真实的陈述的答案,就可以显示出你的知识,但是他们不一定把知识传递给学生,也不一定要考虑学生如何思考,并以此来解释。答案不应该仅仅呈现一个目的地;他们应该引导提问者从他们所处的位置到达目的地。@EricPostchil写技术上不正确的答案或评论会让人更加困惑。但据我所知,在这里很难承认自己的错误。
#include <stdio.h>
int main (void)
{
int a = 5;
int* p = &a; //pointer "p" now points to "a"
int* q;
q = p; //pointer "q" points to "a" as well
p = NULL; //pointer "p" points to NULL
printf("*q = %d\n", *q);
printf("p = %p", (void*)p);
}
*q = 5
p = (nil)
int a = 5;
int* q = &a;
int **p;
p = &q;
*p = NULL; //now *p && q are NULL