存储指针值

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

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

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

 int array[2][3]; array[2][1] = 10; 

同样如下:

 int **array; *(*(array+2)+1) = 10 

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

int * a;

为什么不:

 allocateMemory(*a) 

 allocateMemory(a) 

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

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

 int *a; 

是包含实际值的内存地址,还是指针的内存地址? 我一直认为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); 

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

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

    您需要再使用一层间接:

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

    以下是 comp.lang.c常见问题解答中的 一个很好的解释 。

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

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

     int **x = malloc(sizeof(int *) * 2); for (i = 0; i < 2; i++) x[i] = malloc(sizeof(int) * 3); 

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

  3. 这是:

     int array[2][3]; array[2][1] = 10; 

    同样如下:

     int **array; *(*(array+2)+1) = 10 

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

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

    为什么不:

     allocateMemory(*a) 

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

  5.  int *a; 

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

    这个问题对我来说没有意义,但我会试着解释一下。 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); 

    在两种情况下都正确。

要回答第一个问题,您需要将指针传递给指针。 ( int**

要回答第二个问题,可以使用该语法访问现有数组中的位置。
但是,嵌套数组( int[][] )与指针指针( int** )不同

回答你的第三个问题:

a传递变量a的值,这是一个内存地址。
*a传递变量指向的值,这是一个实际值,而不是内存地址。

如果函数采用指针,则意味着它需要一个地址,而不是一个值。
因此,你需要传递a ,而不是*a
如果a指针指向( int** ),你会传递*a ,而不是**a

你的第一个问题:

你可以传递一个指针的地址:

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

或者你可以返回一个指针值:

 int *allocateMemory() { return malloc(sizeof(int)); } int *ptr = mallocateMemory(); 

我觉得你对指针究竟是什么有点困惑。
指针只是变量,其值表示内存中的地址。 因此,当我们说int *p是指向整数的指针时,这意味着p是一个变量,它保存一个数字,即int的内存地址。
如果希望函数分配整数缓冲区并更改变量p的值,则该函数需要知道存储器p的存储位置。 所以你必须给它一个指向p的指针(即p的内存地址),它本身就是一个指向整数的指针,所以函数需要的是一个指向整数指针的指针(即一个内存地址,其中)该函数应该存储一个数字,而这个数字又是函数分配的整数的内存地址),所以

 void allocateIntBuffer(int **pp) { // by doing "*pp = whatever" you're telling the compiler to store // "whatever" not in the pp variable but in the memory address that // the pp variable is holding. *pp = malloc(...); } // call it like int *p; allocateIntBuffer(&p); 

我认为你的问题的关键是理解指针变量没有什么特别之处。 指针是一个与任何其他变量一样的变量,只是存储在该变量中的值用于表示内存中的位置。

请注意,返回指针或强制调用者将指针移出void * temp变量是唯一可以使用void *类型来允许函数使用不同指针类型的方法。 char **int **等不能转换为void ** 。 因此,我建议您不要尝试做什么,而是使用需要更新指针的函数的返回值,除非您的设计function仅适用于特定类型。 特别是,尝试更改接口以传递指针到指针类型的简单malloc包装器本身就会被破坏。