指针的指针和按引用传递
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));
我很难理解指针的工作原理。 我得到它的方法是,当我声明一个指向 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));