我是 C 语言新手,试图通过编写真实的代码来学习它,而不是孤立和幼稚的书本示例。我在正确理解指针方面遇到了很多困难。我的书并没有真正的帮助。
我有一个指针数组,我正在按以下方式初始化它:
struct Node **cols;
cols = (struct Node *) calloc(N_RESTRICTIONS, sizeof(struct Node *));
// for loop malloc-ing each cols[0..N_RESTRICTIONS] here
这看起来不错。我需要另一个变量,比如 upper_nodes,它最初指向与 cols 相同的节点,但随着算法的发展,它会发生变化,而 cols 不会改变。我试过:
struct Node **upper_nodes;
*upper_nodes = *cols;
我期望的是:upper_nodes地址与col的不同(它们是不同的变量),但是由于每个地址中的第一个指向值由于分配而相同,所以我现在可以索引upper_nodes[i]就像我对 cols 所做的那样,并重新分配它而不影响 cols[i] 指向的内容。
这不是正在发生的事情,我遇到了分段错误,在调试器中我看到两个变量中的第一个值都指向同一个项目,但之后 upper_nodes 具有随机值(例如未初始化,我确信这就是发生的事情,但我不明白)。
我没有得到什么?有什么方法可以做到这一点?
额外问题:我看到上面最后一段代码的作用与:
struct Node **upper_nodes = cols;
这个我也不明白。我现在期望 upper_nodes 和 cols 具有相同的地址,但它们没有,这似乎表明我什至不理解变量是如何工作的。
正如评论中提到的,
*upper_nodes = *cols
只复制一个指针,而不是整个数组。
你可以用循环来做:
for (int i = 0; i < N_RESTRICTIONS; I++) {
upper_nodes[i] = cols[i];
}
或者您可以使用
memcpy()
一次性复制它们:
memcpy(upper_nodes, cols, N_RESTRICTIONS * sizeof *cols);
指针正如其名称所暗示的那样:它们是一个指向另一个事物的事物。
如果你把它全部画在纸上,就会变得非常清楚:
+------+ +------------+ +------------+------------+--- --+ |列 | --> |列[0] | --> |列[0][0] |列[0][1] | ... | +------+ +---------+ +------------+------------+---- -+ |列[1] | +---------+ | 。 | | 。 | | 。 | +---------+
那么当你说你
期望
和upper_nodes
有相同的地址cols
如果您的意思是您期望
&upper_nodes
等于 &cols
那么这是不正确的。拉出来看起来像:
+--------------+ +-------------+ | &upper_nodes | --> |上节点 | --\ +--------------+ +-------------+ | +---------+-----+ >--> |列[0] | ... | +--------+ +------+ | +---------+-----+ | &cols | --> |列 | ----------------/ +--------+ +------+
所以
&upper_nodes
指向变量upper_nodes
。并且 &cols
指向变量 cols
。
并且
upper_nodes
和cols
都指向cols[0]
。
所以
&upper_nodes != &cols
,但是upper_nodes == cols
。
请注意,上图假设
upper_nodes
的原始声明为 struct Node **
。