请教:C语言中typedef struct定义的*SOMETEXT是什么?如何使用?
嘿,作为C语言初学者碰到这个问题太正常了,咱们一步步拆解清楚~
首先得指出你给出的代码里有个明显的错误:typedef struct { ULONG x; ULONG y; } SOMETEXT, *SOMETEXT; 这里重复用了SOMETEXT这个标识符,一个用来指代结构体类型,另一个用来指代指针类型,C编译器会直接报错(比如提示“redefinition of 'SOMETEXT'”),这是不允许的。
接下来咱们说清楚typedef struct里*的正确用法:
1. *的核心作用:定义指针类型别名
当你写typedef struct { ... } 结构体类型名, *指针类型名;的时候,这里的*是用来给「指向该结构体的指针」创建一个类型别名。举个正确的写法示例:
typedef struct { ULONG x; ULONG y; } SOMETEXT, *PSOMETEXT;
这行代码一次性做了两件事:
- 把这个匿名结构体(struct后面没写名字)的类型别名定为
SOMETEXT——也就是说,SOMETEXT等价于struct { ULONG x; ULONG y; } - 同时把「指向这个结构体的指针类型」的别名定为
PSOMETEXT——它等价于struct { ULONG x; ULONG y; } *
2. 怎么实际使用这些类型?
给你几个常见的使用场景:
- 定义结构体变量:直接用
SOMETEXT声明栈上的结构体实例SOMETEXT point; point.x = 100; point.y = 200; - 定义结构体指针变量:用
PSOMETEXT声明指针,不管是指向栈上变量还是堆上分配的内存都可以// 指向栈上的变量 SOMETEXT point = {100, 200}; PSOMETEXT pPoint = &point; printf("x: %lu, y: %lu\n", pPoint->x, pPoint->y); // 指向堆上分配的内存 PSOMETEXT pHeapPoint = (PSOMETEXT)malloc(sizeof(SOMETEXT)); if (pHeapPoint != NULL) { pHeapPoint->x = 300; pHeapPoint->y = 400; free(pHeapPoint); // 堆内存记得释放 }
当然,你也可以不用指针类型别名,直接写SOMETEXT *pPoint,效果完全一样——指针类型别名只是让代码更简洁,尤其在频繁使用指针的场景里更顺手。
3. 额外补充:带结构体标签的写法
如果你需要写自引用的结构体(比如链表节点),就得给结构体加个标签,写法是这样的:
typedef struct _SOMETEXT { ULONG x; ULONG y; struct _SOMETEXT *next; // 这里必须用标签来引用自身 } SOMETEXT, *PSOMETEXT;
这里的_SOMETEXT就是结构体的标签,作用是在结构体内部可以引用自己的类型。如果你的结构体不需要自引用,用之前的匿名结构体+typedef写法就足够了。
内容的提问来源于stack exchange,提问作者irainbow
相关产品推荐
相关产品推荐

