结构体指针如何初始化struct XXX *p
时间: 2024-09-18 20:04:15 浏览: 62
结构体指针初始化通常涉及将指针指向一个已经存在的结构体实例,或者是将其设置为NULL。下面是一些示例:
1. 初始化指向已分配内存的结构体指针:
```c
struct MyClass {
int value;
char name[20];
};
// 分配内存并创建一个结构体实例
struct MyClass obj = { .value = 42, .name = "Example" };
// 或者使用 malloc
struct MyClass *p = (struct MyClass*)malloc(sizeof(struct MyClass));
if (p) {
p->value = obj.value; // 或者直接复制整个结构体
strcpy(p->name, obj.name);
}
// 现在p是一个指向MyClass的指针,并指向刚刚创建的obj
```
2. 初始化为NULL:
```c
struct MyClass *p = NULL; // 指向空地址,表示未分配内存或无内容
```
在C99之后,也可以直接对指针本身进行初始化,指向特定类型的结构体变量:
```c
struct MyClass p = { .value = 0, .name[0] = '\0' }; // 类似于指针,但更简洁
```
但这并不意味着p是指向另一个结构体的指针,而是创建了一个名为p的新结构体实例。
相关问题
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct bnode { int data; struct bnode *lc; struct bnode *rc; }bnode; void creat(bnode *proot) { bnode *p,*q; int k,n,i; proot=NULL;//初始化空树 printf("输入二叉树的节点元素个数n:");//输入数据元素个数 scanf("%d",&n); for(i=0;i<n;i++) { p=(bnode*)malloc(sizeof(bnode)); if(p == NULL) {//检查分配内存是否成功 printf("树满\n"); exit(1);} p->lc=NULL; p->rc=NULL; printf("k="); scanf("%d",&k); if(proot==NULL) proot=p; else {q=proot; while(q!=NULL) {if(q->data>k) if(q->lc!=NULL) q=q->lc; else {q->lc=p; q=NULL; } else if(q->rc!=NULL) q=q->rc; else {q->rc=p; q=NULL; } } } } } void visit(bnode *proot) { bnode *temp=proot->lc; proot->lc=proot->rc; proot->rc=temp; } int preorder(bnode *proot)//递归遍历 {if(proot==NULL) print("xxx\n"); return; { printf("%d",proot->data); if(proot->lc!=NULL) preorder(proot->lc); if(proot->rc!=NULL); preorder(proot->rc); } } void print(bnode *proot) { int level = -1; //记录是第几层次 int i; if (NULL == proot) return; level++; print(proot->rc); level--; level++; for (i = 0; i < level; i++) printf("\t"); printf("%d\n", proot->data); print(proot->lc); level--; } int main() { bnode *proot=NULL; creat(proot); preorder(proot); print(proot); return 0; }
这段代码实现了二叉树的创建和遍历,并且还包括了一个函数用于翻转二叉树。具体来说,这个程序定义了一个结构体bnode,其中包含了节点值和左右子树的指针。接着,使用creat函数创建了二叉树,该函数通过输入节点元素个数n和节点的值k,动态分配内存创建节点,并将它们插入到二叉树中。接着,使用preorder函数递归遍历二叉树,输出节点的值。最后,使用print函数按照中序遍历的方式输出二叉树的结构。值得注意的是,print函数在输出节点值之前先输出了一个制表符,以此来表示节点的层次。
阅读全文