C 两个指针指向同一位置时出现问题

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; /

我不知道如何解决指针的问题。我的指针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; //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