指针指针和引用传递

问题描述 投票:-1回答:3

我很难理解指针是如何工作的。我得到它的方式是,当我声明一个指向int的指针时,我创建了一个变量,它包含一个地址(必须初始化甚至可以在int上运行)和一个int变量。在视觉上,我用这种方式表示(地址; int)。例如,如果我宣布

int* number;

我将“number”作为地址变量,“* number”作为int变量。

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

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

#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工作正常的时候。另外,我还想知道是否可以通过使用“incrementmenter”函数而不是“incrementer_2”来修改* c的值。事实上,我只是想我可以简单地用main编写

incrementer(&(*c));

或者,以更简单的方式

incrementer(c);

但它们都不适用于运行时。

c pass-by-reference pointer-to-pointer
3个回答
0
投票

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

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

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

问题:

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

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

*d = malloc(sizeof(int));

要么

 *d = c;

但是* d需要先指出一些东西才能使用** d。


0
投票
int b

b是一个int。我们可以通过编写b来引用它。

b = 7;

在这里,我们为b分配一个数字。

int* c 

c是指向int的指针。我们可以通过写int来引用*c

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));

0
投票

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

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

我得到它的方式是,当我声明一个指向int的指针时,我创建了一个变量,它包含一个地址(必须初始化甚至可以在int上运行)和一个int变量。

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

附: - incrementer(c)应该工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.