gpt4 book ai didi

c - 指针和引用传递的指针

转载 作者:行者123 更新时间:2023-11-30 19:31:45 24 4
gpt4 key购买 nike

我正在努力理解指针是如何工作的。我得到它的方式是,当我声明一个指向 int 的指针时,我创建了一个包含地址的变量(必须初始化该地址才能对 int 进行操作)和一个 int 变量。从视觉上看,我会这样表示(地址;int)。例如,如果我声明

int* number;

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

同样,声明诸如 int** d 之类的内容应该意味着创建一个指向 (address;int) 的指针。那就是[地址;(地址;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);

但它们都不能在运行时运行。

最佳答案

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

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

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

问题在于:

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

d 已初始化 *d 未初始化。你可以这样做:

*d = malloc(sizeof(int));

 *d = c;

但是在使用 **d 之前需要先指向 *d。

关于c - 指针和引用传递的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com