C语言之结构体和结构体指针

声明一个结构体类型的一般形式如下:
struct 结构体类型名
{
成员表列
};

结构体的类型可以有很多种,结构体类型中的成员由开发者自己定义,并且成员不用初始化。
另外,一个结构体成员可以属于另一个结构体类型,例如:

 struct TIME
{
        int date;
        int month;
        int year;
        int hour;
        int min;
        int sec;
};

struct nmea_msg
{
    struct TIME utc;
    char gpssta;                                                             
    int longitude;                          
    int latitude;                                                 
    short speed;                       
    short altitude;                   
};

定义结构体变量的方法有三种:
1.先声明结构体类型,再定义该类型变量:

一般形式为:
struct 结构体类型名
{
成员表列
};
struct 结构体类型名 变量名表列;

例如:

struct UDP_Server_Thread_Para
{
	void *pData;
	int Len;
};
struct UDP_Server_Thread_Para  UDPThreadPara1,UDPThreadPara2;

一个在该定义方式下的程序例子:

#include<stdio.h>

struct UDP_Server_Thread_Para
{
    void *pData;
    int len;
};

int main()
{
   struct UDP_Server_Thread_Para UDPThreadPara1,UDPThreadPara2;
   
   UDPThreadPara1.pData = "hello";
   UDPThreadPara1.len = 1;

   UDPThreadPara2.pData = "world";
   UDPThreadPara2.len = 2;

   printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);

   printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);

   return 0;
}

2.在声明的同时定义变量:

一般形式为:
struct 结构体类型名
{
成员表列
}变量名表列;

例如:

struct UDP_Server_Thread_Para
{
	void *pData;
	int Len;
}UDPThreadPara1,UDPThreadPara2;

一个在该定义方式下的程序例子:

#include<stdio.h>

struct UDP_Server_Thread_Para
{
    void *pData;
    int len;
}UDPThreadPara1,UDPThreadPara2;

int main()
{
   UDPThreadPara1.pData = "hello";
   UDPThreadPara1.len = 1;

   UDPThreadPara2.pData = "world";
   UDPThreadPara2.len = 2;

   struct UDP_Server_Thread_Para UDPThreadPara3;	//新增该结构体类型变量
   UDPThreadPara3.pData = "!!!!";
   UDPThreadPara3.len = 3;

   printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);

   printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);

   printf("UDPThreadPara3: %s, len %d\n", (char*)UDPThreadPara3.pData, UDPThreadPara3.len);
   
   return 0;
}

3.不指定类型名直接定义结构体类型变量:

一般形式为:
struct
{
成员表列
}变量名表列;

struct
{
	void *pData;
	int Len;
}UDPThreadPara1,UDPThreadPara2;

这种方式只能够定义一次,不能再以此定义其它变量。

一个在该定义方式下的程序例子:

#include<stdio.h>

struct
{
    void *pData;
    int len;
}UDPThreadPara1,UDPThreadPara2;

int main()
{
   UDPThreadPara1.pData = "hello";
   UDPThreadPara1.len = 1;

   UDPThreadPara2.pData = "world";
   UDPThreadPara2.len = 2;

   printf("UDPThreadPara1: %s, len %d\n", (char*)UDPThreadPara1.pData, UDPThreadPara1.len);

   printf("UDPThreadPara2: %s, len %d\n", (char*)UDPThreadPara2.pData, UDPThreadPara2.len);

   return 0;
}

获取结构体成员

通过结构体指针可以获取结构体成员,一般形式为:

(*pointer).memberName

或者:

pointer->memberName

第一种写法中,.的优先级高于*(*pointer)两边的括号不能少。如果去掉括号写作*pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。

第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。

上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。

【示例】结构体指针的使用。

#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);

return 0;
}

运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

【示例】结构体数组指针的使用。

#include <stdio.h>

struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[] = {
{"Zhou ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"Liu fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
}, *ps;

int main(){
//求数组长度
int len = sizeof(stus) / sizeof(struct stu);
printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
for(ps=stus; ps<stus+len; ps++){
printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
}

return 0;
}

运行结果:

Name            Num     Age     Group   Score
Zhou ping       5       18      C       145.0
Zhang ping      4       19      A       130.5
Liu fang        1       18      A       148.5
Cheng ling      2       17      F       139.0
Wang ming       3       17      B       144.5

猜你喜欢

转载自blog.csdn.net/u011397314/article/details/110916407