指针的指针和按引用传递

Pointers of pointer and pass by reference

我很难理解指针的工作原理。 我得到它的方法是,当我声明一个指向 int 的指针时,我创建了一个包含地址(必须初始化才能对 int 进行操作)的变量和一个 int 变量。在视觉上,我将以这种方式表示(地址;整数)。例如,如果我声明

int* number;

我希望 "number" 是地址变量,“*number”是 int 变量。

同样,声明诸如 int** d 之类的东西应该意味着创建一个指向 (address;int) 的指针。那是 [地址;(地址;整数)].

考虑到这一点,我试图通过使用外部函数 incrementer_3 修改 **d 的 int 值,这就是所谓的按引用传递,但我在运行时遇到错误。所以,我想知道我错过了什么。

#include <stdio.h>

void incrementer(int* a) {
    (*a)++;
}

void incrementer_2(int** a) {
    (**a)++;
}

void incrementer_3(int*** a) {
    (***a)++;
}

int main() {
    int b = 7;
    incrementer(&b);
    printf("%d\n", b);

    int* c = (int*)malloc(sizeof(int));
    *c = 4;
    incrementer_2(&c);
    printf("%d\n", *c);

    int** d = (int**)malloc(sizeof(int*));
    **d = 6;
    incrementer_3(&d);
    printf("%d\n", **d);

    system("pause");
}

仅供参考,我增加 b 和 c 的部分工作正常。 另外,我还想知道是否可以使用函数 "incrementer" 而不是 "incrementer_2" 来修改 *c 的值。事实上,我只是在想我可以简单地从 main

incrementer(&(*c));

或者,以更简单的方式

incrementer(c);

但其中 none 可以在运行时运行。

问题是您为 int* 分配了内存,但没有为 int 分配任何内存或设置 int 的指针。 应该是:

int** d = (int**)malloc(sizeof(int*)); *d = (int*)malloc(sizeof(int)); **d=6;

The way I got it is that, when I declare a pointer to, say, int, I create both a variable that'll contain an address (that must be initialized to even operate on the int) and an int variable.

不,当你声明一个指针时,你创建了一个知道如何包含地址的变量。当您使用 malloc() 时,您会分配内存。 malloc() returns 您可以分配给指针的地址。

P.S。 - incrementer(c) 应该可以正常工作

您需要记住,指针实际上不需要引用任何东西,即使它确实引用了某物,也不一定是有效的。跟踪这些事情是您作为程序员的工作。

按照惯例,无效指针将被赋予值 0(这是 NULL 最终的结果),但这只是惯例,在某些情况下可能会使用其他值。

所以,使用 "int* number;" 你已经声明了一个指向 int 的指针,但是因为它没有被初始化,你完全不知道它包含什么值,此时取消引用它是未定义的行为 - 这意味着大多数如果您尝试这样做,任何事情都可能发生,但实际上它可能只会让您的程序崩溃。

问题在于:

int** d = (int**)malloc(sizeof(int*));
    **d = 6;

是 while d 被初始化 *d 不是。你可以这样做:

*d = malloc(sizeof(int));

 *d = c;

但是 *d 需要指向某物才能使用 **d。

int b

b 是一个 int。我们可以通过写b.

来引用它
b = 7;

这里我们给b分配一个数字。

int* c 

c 是一个应该指向 int 的指针。我们可以通过写作 *c.

来引用 int
c = (int*)malloc(sizeof(int));

我们找到了一块可以容纳int的内存,并制作了一个指向那块内存的指针,并赋值给了c。一切顺利。

*c = 4;

这里我们给*c分配一个数字。看? *c 的行为与 b 一样。但这只是因为我们用一个有效的指针初始化了它!没有它,*c = 4; 将无效。

int** d

d是一个指针,应该指向一个int*类型的东西,我们可以写成*d来引用。 int* 反过来应该指向一个 int,我们可以通过写作 **d.

来引用它
d = (int**)malloc(sizeof(int*));

我们找到了一块可以容纳int*的内存,并制作了一个指向那块内存的指针,并赋值给了d。一切都很好。现在我们称int**d,它指向什么?

没有。为了将它指向某物,我们可以找到一块可以容纳 int 的内存,然后创建一个指向那块内存的指针,并将其分配给我们的 *d,就像我们之前用 c 做过。看? *d 的行为与 c 一样。为了使用 *c 我们必须先用一个有效的指针初始化 c 。为了使用 **d 我们需要先用一个有效的指针初始化 *d

*d = (int*)malloc(sizeof(int));