关于引用传值及结构体struct p中嵌套struct p* ptr的技术问询
关于引用传值和自引用结构体的解析
一、啥是引用传值?
简单说,引用传值(也常叫传引用)就是调用函数时,不是把变量的“副本”传给函数,而是把变量的内存地址传过去。这样函数里对参数的修改,会直接作用在原变量的内存空间上,函数执行完后,原变量的值会跟着改变。
举个C语言的例子(C里没有原生的引用类型,通常用指针模拟传引用):
void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 1, y = 2; swap(&x, &y); // 传递x和y的内存地址 printf("x=%d, y=%d", x, y); // 输出x=2, y=1,原变量被直接修改 }
对比值传递:如果swap函数参数是int a, int b,那函数里改的只是a和b的临时副本,main里的x和y根本不会变。这就是传引用和传值的核心区别——是否直接操作原变量的内存。
二、解析自引用结构体struct p{ int x; int y; struct p *ptr; };
先拆解这个结构体:
struct p是我们定义的结构体类型,名字叫p;- 里面的
int x;和int y;是两个普通整数成员,很好理解; - 你困惑的
struct p *ptr;,这是一个指向同类型结构体的指针,这种写法叫「自引用结构体」。
为啥能这么写?很多新手第一次见都会懵——结构体还没定义完呢,怎么就能用自己的类型?其实这里只是声明一个指针,编译器根本不需要知道struct p的完整大小:因为指针的大小是固定的(32位系统占4字节,64位占8字节),不管指向什么类型,指针本身的大小都一样。但如果写成struct p ptr;就不行了,这会导致结构体无限嵌套,编译器根本算不出它的大小,而指针就没有这个问题。
这个自引用指针的用处可大了!它是构建链表、二叉树这类链式数据结构的基础:比如链表的每个节点都是struct p类型,ptr用来指向下一个节点,就能把一个个节点串成一条链;如果是二叉树,还能搞两个指针left和right分别指向左右子节点。
举个简单的链表节点示例:
// 创建第一个节点 struct p node1; node1.x = 10; node1.y = 20; // 创建第二个节点 struct p node2; node2.x = 30; node2.y = 40; // 把两个节点连起来 node1.ptr = &node2; // 现在通过node1.ptr就能访问node2的成员 printf("node2.x = %d", node1.ptr->x); // 输出30
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

