【发布时间】:2017-12-30 20:35:33
【问题描述】:
我很难理解指针的工作原理。 我得到它的方式是,当我声明一个指向 int 的指针时,我创建了一个变量,该变量将包含一个地址(必须初始化才能对 int 进行操作)和一个 int 变量。从视觉上看,我会以这种方式表示(地址;int)。例如,如果我声明
int* number;
我将“number”作为地址变量,“*number”作为 int 变量。
同样,声明诸如 int** d 之类的东西应该意味着创建一个指向 (address;int) 的指针。那将是 [address;(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);
但它们都不能在运行时工作。
【问题讨论】:
-
**d = 6;- 这会调用未定义的行为。你还没有初始化*d。 -
为什么不简单地使用
int *c = &b;和int **d = &c;? -
还要注意C没有“按引用传递”,只能通过指针和address-of操作符模拟。
-
最后,以你的方式和我的方式,做例如
incrementer(c)应该可以正常工作(如果在您当前的代码中,您已正确初始化c)。 -
@Someprogrammerdude 关于“通过引用传递”:事实上,我只是使用了我在老师的幻灯片中找到的术语。
标签: c pass-by-reference pointer-to-pointer