任何东西都可以凝固

导航

结构体指针

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个结构体之间是可以复制的


或者也可以定义一个函数来做,函数体里面要用挨个赋值的方式

posted on 2016-10-29 16:02  任何东西都可以凝固  阅读(250)  评论(0)    收藏  举报