我很难理解指针是如何工作的。 我得到它的方式是,当我声明一个指向int的指针时,我创建了一个变量,它包含一个地址(必须初始化甚至可以在int上运行)和一个int变量。在视觉上,我用这种方式表示(地址; int)。例如,如果我宣布
int* number;
我的“number”是地址变量,“* number”是int变量。
同样,声明诸如int ** d之类的东西应该意味着创建一个指向(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的值。事实上,我只是想我可以简单地从主
写incrementer(&(*c));
或者,以更简单的方式
incrementer(c);
但它们都没有在运行时工作。
答案 0 :(得分:0)
问题在于您为int*
分配内存,但是您没有为int
分配任何内存或设置int
的指针。
应该是:
int** d = (int**)malloc(sizeof(int*));
*d = (int*)malloc(sizeof(int));
**d=6;
我得到它的方式是,当我声明一个指向int的指针时,我创建了一个包含地址的变量(必须初始化为甚至对int进行操作)和一个int变量。
不,当您声明指针时,您将创建一个知道如何包含地址的变量。使用malloc()
时,您可以分配内存。 malloc()
返回您可以指定给指针的地址。
P.S。 - incrementer(c)
应该可以正常使用
答案 1 :(得分:0)
你需要记住,指针实际上不需要引用任何东西,即使它确实指的是某些东西不必有效。跟踪这些事情是你作为程序员的工作。
按照惯例,无效指针将被赋予值0(这最终是NULL),但这只是约定,在某些情况下可能会使用其他值。
所以,使用&#34; int * number;&#34;你已经声明了一个指向int的指针,但由于它没有被初始化,你完全不知道它包含什么值,此时取消引用它是未定义的行为 - 这意味着如果你试过,大多数都可以发生这样做,虽然实际上它可能会让你的程序崩溃。
问题:
int** d = (int**)malloc(sizeof(int*));
**d = 6;
是d初始化时* d不是。你可以这样做:
*d = malloc(sizeof(int));
或
*d = c;
但是* d需要在使用** d之前指出。
答案 2 :(得分: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));