我对指针有问题,我不知道如何解决。我的指针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 和 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; //pointer "p" points to NULL
这是错误的,您可以取消引用p
并设置为它引用NULL
值。
使用p = NULL
.
*p = NULL; //pointer "p" points to NULL
不,它没有。取消引用此指针并将a
设置为 NULL 转换为int
(通常为零)
如果要将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; //pointer "p" points to NULL
不是重置指针指向的位置,而是
在引用的位置设置值。
举个例子:
*ptr = value // (writes the value to the memory location of ptr)
ptr = value // (changes the referenced memory location to value)
代码中的问题是:
*p = NULL;
这样,您取消引用p
并将NULL
的值写入a
,这在您的情况下是错误的。NULL
旨在分配或比较指针,而不是指针指向的对象(除非引用的对象,此处a
,也将是一个指针 - (指针到指针))。
溶液:
您需要省略取消引用运算符 (*
):
p = NULL;
将NULL
分配给p
而不是a
。
更正的代码(在线示例):
#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 = %dn", *q);
printf("p = %p", (void*)p);
}
输出:
*q = 5
p = (nil)