初学者问题:我认为我有点理解指针(int * p,x = 1,p =& x)但是当" - >"显然涉及结构。
<form method="post" action="#" dir="rtl">
<textarea name="question" placeholder="پرسیار"></textarea>
<input type="text" name="firstChoice" placeholder="وهڵامی یهكهم"/>
<input type="text" name="secondChoice" placeholder="وهڵامی دووهم"/>
<input type="text" name="thirdChoice" placeholder="وهڵامی سێیهم"/>
<input type="text" name="fourthChoice" placeholder="وهڵامی چوارهم"/>
<input type="submit" name="submitQuestion" value="داخڵبكه" style="width:52.4%;cursor:pointer;"/>
</form>
和
typedef struct node
{
bool is_word;
struct node* children[27];
}
node;
简单地说,我有一个指针,我希望它存储自己的地址。但它给了我:
node* root = calloc(1, sizeof(node));
printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);
printf("\n");
root->children[1] = &root->children[1];
printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);
我尝试了一些组合,到目前为止都没有。我错过了什么?
答案 0 :(得分:0)
更改
root->children[1] = &root->children[1];
到
root->children[1] = root->children[1];
它不起作用的原因完全如错误消息中所述 -
root->children[i]
的类型为node *,这意味着root-&gt; children [i]本身就是一个指向struct node
类型数据的内存地址。
话虽如此,你为什么要存储内存地址?
请考虑以下示例:您是一个指向int类型的指针:
int *ptr
现在,如果你想要ptr的内存地址,你可以只printf("%p", ptr)
如果你想要数据,只需printf("%d", *ptr)
答案 1 :(得分:0)
根据您对Ishay的答案的评论,您希望实现 content == address ...
很容易获得,但我想警告你为什么不应该这样做。如果node->children[1]
指向其自己的地址,则取消引用指针是未定义的行为,因为其中存在不 a node
而是node *
。这意味着,一旦你拥有了它,任何对*(node->children[1])
的读取或写入,甚至使用node->children[1]->...
语法的访问都是严格别名规则的明确未定义行为(搜索 C的SO)严格的别名规则了解更多详情。
一旦你被警告过,C语言对程序员非常有信心,并且允许你做甚至非感性的事情:
root->children[1] = (void *) &root->children[1]; /* or root->children[1] = (node *) &root->children[1]; */
printf("address:%p\n", &root->children[1]);
printf("content%p\n", root->children[1]);
将显示您想要的内容。这是因为始终允许将指针复制到(void *)
,同样,void *
可以复制到任何其他指针。 C标准要求(如果没有对齐问题,并且在您的示例中不应该存在),那些指针分配是完美定义的:
node ** p = (node **) root->children[1];
也已定义,p
必须指向root->children[1]
。换句话说,您可以将指向一种类型的指针转换为指向另一种类型的指针,然后将其强制转换为您提供初始值,但不得拒绝不正确的指针。