存储指针值

Amu*_*umu 4 c pointers memory-management

据我所知,当一个指针传递给一个函数时,它只是一个真实指针的副本.现在,我想要更改真正的指针,而不必从函数返回指针.例如:

int *ptr;

void allocateMemory(int *pointer)
{
     pointer = malloc(sizeof(int));
}

allocateMemory(ptr);
Run Code Online (Sandbox Code Playgroud)

另一件事,就是如何将内存分配给2个或更多维数组呢?不是通过下标,而是通过指针算术.这是:

int array[2][3];
array[2][1] = 10;
Run Code Online (Sandbox Code Playgroud)

同样如下:

int **array;
*(*(array+2)+1) = 10
Run Code Online (Sandbox Code Playgroud)

另外,为什么我必须传入指向函数的指针的内存地址,而不是实际的指针本身.例如:

int*a;

为什么不:

allocateMemory(*a) 
Run Code Online (Sandbox Code Playgroud)

allocateMemory(a)
Run Code Online (Sandbox Code Playgroud)

我知道我总是要这样做,但我真的不明白为什么.请向我解释.

最后一件事是,在这样的指针中:

int *a;
Run Code Online (Sandbox Code Playgroud)

是包含实际值的内存地址,还是指针的内存地址?我一直认为a是它指向的实际值的内存地址,但我不确定.顺便说一下,当打印这样的指针时:

printf("Is this address of integer it is pointing to?%p\n",a);
printf("Is this address of the pointer itself?%p\n",&a);
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 10

我会尝试一次解决这些问题:

  1. 现在,我想要更改真正的指针,而不必从函数返回指针.

    您需要再使用一层间接:

    int *ptr;
    
    void allocateMemory(int **pointer)
    {
        *pointer = malloc(sizeof(int));
    }
    
    allocateMemory(&ptr);
    
    Run Code Online (Sandbox Code Playgroud)

    这里是一个很好的解释comp.lang.c常见问题.

  2. 另一件事,就是如何将内存分配给2个或更多维数组呢?

    第一个维度的一个分配,然后是另一个维度的分配循环:

    int **x = malloc(sizeof(int *) * 2);
    for (i = 0; i < 2; i++)
        x[i] = malloc(sizeof(int) * 3);
    
    Run Code Online (Sandbox Code Playgroud)

    同样,这里comp.lang.c FAQ中这个确切问题的链接.

  3. 这是:

    int array[2][3];
    array[2][1] = 10;
    
    Run Code Online (Sandbox Code Playgroud)

    同样如下:

    int **array;
    *(*(array+2)+1) = 10
    
    Run Code Online (Sandbox Code Playgroud)

    绝对不. 指针和数组是不同的.但是,您有时可以互换使用它们.从comp.lang.c FAQ中查看这些问题.

  4. 另外,为什么我必须传入指向函数的指针的内存地址,而不是实际的指针本身?

    为什么不:

    allocateMemory(*a) 
    
    Run Code Online (Sandbox Code Playgroud)

    这是两件事--C没有传递引用,除非你通过传递指针自己实现它,在这种情况下也因为a尚未初始化 - 如果你要取消引用它,你将导致未定义的行为.这个问题是一个类似的情况这一项,在发现comp.lang.c常见问题解答.

  5. int *a;
    
    Run Code Online (Sandbox Code Playgroud)

    是包含实际值的内存地址,还是指针的内存地址?

    这个问题对我来说没有意义,但我会试着解释一下. a(当正确初始化时 - 这里的例子不是)是一个地址(指针本身). *a是指向的对象 - 在这种情况下将是一个int.

  6. 顺便说一下,当打印这样的指针时:

    printf("Is this address of integer it is pointing to?%p\n",a);
    printf("Is this address of the pointer itself?%p\n",&a);
    
    Run Code Online (Sandbox Code Playgroud)

    在两种情况下都正确.