如果p是指向int的指针,那么将使用& p

时间:2015-01-21 14:10:12

标签: c pointers

在下面的代码中,p是指向int的指针。很明显,p指向i的地址。通过我的研究,我知道& p指向指针p的地址。但我不知道为什么你需要单独的地址。还有什么时候你会使用& p。

int main() {
    int i = 3, *p = &i;
    printf("%p",&p);
    printf("%p",p);
    return 0;
}

3 个答案:

答案 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);
}

指针本身也是变量,因此它们需要在某处进行处理,因此指针的地址会告诉您存储指针的位置,它的值会告诉您它指向的位置。

通过了解它的存储位置,您可以执行上述操作。