在下面的代码中,p是指向int的指针。很明显,p指向i的地址。通过我的研究,我知道& p指向指针p的地址。但我不知道为什么你需要单独的地址。还有什么时候你会使用& p。
int main() {
int i = 3, *p = &i;
printf("%p",&p);
printf("%p",p);
return 0;
}
答案 0 :(得分:3)
如果p
指向int
,那么
int **q = &p;
如果要使用指向的指针,则使用单个指针的地址将其指定给指针指针。
只是为了指出指针也是一种数据类型,它存储在内存位置,它将有效的内存位置作为其值。存储此有效内存位置的地址由&p
您的printf()
也需要修复。 %p
期待void *
printf("%p",(void *)p);
答案 1 :(得分:2)
一个简单的例子:
int nochange(int *c, int *val)
{
c = val; // Changes local pointer c to point to val
// Note that C passes copies of the arguments, not actual references.
}
int do_change(int **c, int *val)
{
*c = val; // Accesses the real pointer c at its real location and makes
// that one point to val
// Even though c is a pointer-to-pointer copy, its value is
// copied too, and the value is the address of the real c
}
int main()
{
int a = 1;
int b = 2;
int *c = &a; // A pointer is also a datatype that resides in memory
printf("%d\n", *c); // Will print 1
nochange(c, &b);
printf("%d\n", *c); // Will print 1
do_change(&c, &b);
printf("%d\n", *c); // Will print 2 because c now points to b
}
我有一个类似的答案,更详细一点关于指针与指针指针:pointer of a pointer in linked list append
答案 2 :(得分:2)
但我不明白为什么你需要单独的地址
你没有,但是存在操作符的地址,所以你可以获取指针的地址,这就是
printf("%p\n", &p);
正在打印。
还有什么时候会使用
&p
在某些情况下这可能会有用,例如考虑您需要将指针传递给可以重新分配到函数中的函数,您可以执行类似这样的操作
int allocateIntegerArray(int **pointerToPointer, size_t someSize)
{
if (pointerToPointer == NULL)
return 0;
*pointerToPointer = malloc(someSize * sizeof(int));
return (*pointerToPointer != NULL);
}
然后您可以通过以下方式使用此功能
int *pointer;
if (allocateIntergerArray(&pointer, 10) == 0)
{
fprintf(stderr, "Error, cannot allocate integer array\n");
/* do some extra cleanup or recover from this error, or exit() */
exit(0);
}
指针本身也是变量,因此它们需要在某处进行处理,因此指针的地址会告诉您存储指针的位置,它的值会告诉您它指向的位置。
通过了解它的存储位置,您可以执行上述操作。