结构体指针
C语言中,创建结构体指针是很常见的。
1. 简单的结构体指针
typedef struct
{
char name[21];
char city[21];
char state[3];
} Rec;//用typedef重新命名了这个typedef struct{}代表的结构体类型,类型的新名称为Rec,
typedef Rec *RecPointer; //又用tyoedef重新命名了一个类型为Rec的指针,而Rec是一个结构体的类型名,所以*RecPointer是结构体类型(Rec的)的指针的新的类型名(也是一个数据类型名,具体说就是一个Rec结构体指针类型,该指针类型的新名字为RecPointer。
RecPointer r;
r=(RecPointer)malloc(sizeof(Rec));
r 是一个指向结构体的指针。请注意,因为r 是一个指针,所以像其他指针一样占用4 个字节的内存。而
malloc 语句会从堆上分配45字节的内存。*r 是一个结构体,像任何其他Rec 类型的结构体一样。下面的
代码显示了这个指针变量的典型用法:
strcpy((*r).name, "Leigh");
strcpy((*r).city, "Raleigh");
strcpy((*r).state, "NC");
printf("%sn", (*r).city);
free(r);
2. 包含指针的结构体
typedef struct
{
char name[21];
char city[21];
char phone[21];
char *comment;
} Addr;
Addr s;
char comm[100];
gets(s.name, 20);
gets(s.city, 20);
gets(s.phone, 20);
gets(comm, 100);
s.comment= (char *)malloc(sizeof(char[strlen(comm)+1])); 此处malloc分配后s.comment指向的是一个字符数组的首地址,所以下一步可以用strcpy函数将comm的内容给s.comment指向的空间。
strcpy(s.comment, comm);
3. 包含指向自身指针的结构体
例如C语言中链表结点的定义:
struct node
{
char no[7];
int score;
struct node *next
}
4. 结构体的初始化
问题示例:
struct student{
int a;
int b;
}a={1,2},b;//第一种方法:正确
_________________________
struct student{
int a;
int b;
}a,b;
a={1,2}; //第二种方法:错误
为什么?
答案:
第一种做法叫初始化,C语言允许结构体初始化,但不允许第二种那样赋值
如果你写
struct student
{
int a;
int b;
};
struct student a={1,2}; // 也是对的,这就叫初始化
至于怎么样才能做到直接赋值,C语言里面并没有这样的操作
重载操作符也是C++里面的了
可以这样:
struct student b={1,2};
a=b; // C语言里面2个结构体之间是可以复制的
或者也可以定义一个函数来做,函数体里面要用挨个赋值的方式
浙公网安备 33010602011771号