结构体:
定义语法:
struct 结构体名{
成员列表;
};
成员之间以分号隔开,最后一个成员也需要加分号
声明结构体变量:
最常用的方法:
struct 结构体名 变量名;
类型 变量名;
类型 变量名 = 数据;
在定义结构体的时候同时在大括号后面写变量名
结构体变量的赋值:
语法:
变量名.成员 = 数据;
例: p.age = 16;
声明时就初始化(给所有成员赋值)
struct 结构体名 变量名 = { 数据1,数据2,数据3....数据n };
例: struct Person p = { "刘德华",16 };
结构体变量的取值:
语法:变量名.成员;
例:p.age; //取出这个结构体变量age成员的值
结构体变量他们之间的赋值是值传递:也就是改变了一个变量的值,不会影响另外一个变量
结构体作为函数的参数:也是值传递
函数参数的语法:
返回值类型 函数名(struct 结构体名 形参名){
函数体;
}
所以结构体变量传进去是为了做某种运算或者打印这个结构体
例:比较两个女朋友的条件,是不是封装成一个函数,把条件最好的那个给返回
回忆:怎样定义数组
语法: 类型 数组名[长度];
根据这个语法,能不能定义结构体数组??
能!
语法: struct 结构体名 数组名[长度];
例: struct Person ps[5];//5个长度的struct Person结构体数据
注意:结构体数组跟普通数组一毛一样的用法,只不过类型看着比较非主流,然后取数组每个元素时还需要点出它的成员
例: ps[0].name;
ps[0].age;
结构体作为函数的返回值:
语法:struct 结构体名 函数名(参数列表){
函数体;
}
1:定义一个人类的结构体,并且声明这个类型的数组,长度为3个,并且打印出每个元素的值
2:写一个函数,返回一个结构体变量,并接收这个返回值,再打印出来
typedef:
作用:给类型起别名
语法:typedef 类型 别名;
例: typedef int i; //那么以后i就等于int
typedef struct Person pp; //那么以后pp就等于struct Person
注意:一般typedef用在结构体时都是直接在定义结构体的时候就用typedef
例:
typedef struct{
char *color;
int weight;
}Dog;
那么此时,Dog就是这个结构体的类型了
声明这个结构体的变量:Dog d;
注意:如果定义结构体时加了typedef,那么大括号后面的标示符就是类型了
枚举:
*/
#include <stdio.h>
//结构体定义的例子
struct Person{
char *name;
int age;
}p1,p2; //p1和p2就是这个结构体的变量
typedef struct Person stPerson;//以后stPerson就是struct Person
//直接在定义结构体时就改了名字
typedef struct{
char *color;
int weight;
}Dog,D; //Dog就是这个结构体的类型,D也是结构体类型,如果加了typedef在大括号后面加的标示符都是类型,那么永远无法在定义结构体的时候就声明变量
//测试形参改变
void changePerson(struct Person p){
p.age = 200;
}
//结构体作为函数参数来打印
void printPerson(struct Person p){
printf("%s %d\n",p.name,p.age);
}
//结构体作为函数的返回值
stPerson getPerson(){ //函数名叫getPerson 返回值类型是:struct Person
struct Person p1 = { "函数生成的",200 };
return p1;
}
int main(int argc, const char * argv[]) {
//用typedef定义的类型来声明结构体数组
stPerson pArr[5];//这就是一个结构体数组
pArr[0].name = "刘德华";//赋值
Dog bigYellow;
bigYellow.color = "屎黄";
bigYellow.weight = 20;
D wangCai;
wangCai.color = "金黄";
wangCai.weight = 20;
//声明结构体变量时就初始化
/*
struct Person p1 = { "刘德华",16 };
struct Person p2 = p1;
p2.age = 36;
printf("%d\n",p1.age);//16
//测试形参改变,实参会不会发生改变
changePerson(p1);
printf("%d\n",p1.age);//16
printPerson(p1);//这个可以打印
printPerson(p2);//也可以打印
*/
//结构体数组
/*
struct Person ps[4]; //数组中的每一个元素都是一个结构体变量
ps[0].name = "刘德华";//可以理解为取出来的是一个结构体变量
ps[0].age = 16;
ps[1] = (struct Person){ "张学友",17 };
// ps[2].name = xxx;
// ps[3] = {xxx,xxx};
int nums[5] = {1,2,3,4,5};
//二维数组:一个数组里面每个元素又是一个数组
int nums2[2][3] = { {1,2,3},{4,5,6} };
//因为结构体数组中的每一个元素又是一个结构体变量,所以初始化赋值时,必须以结构体变量的初始化方式来赋值
// struct Person ps2[] = { { "刘德华",16 },{ "张学友",17 },{ "郭富城",18 },{ "花满楼",14 } };
//
// //回顾:数组长度的计算 sizeof(数组名) / sizeof(类型);
//
// int len = sizeof(ps2) / sizeof(struct Person);
//
// printf("len = %d \n",len);//4
// struct Person ps2[10] = { { "刘德华",16 },{ "张学友",17 },{ "郭富城",18 },{ "花满楼",14 } }; //部分初始化,其他元素为0
//
// //回顾:数组长度的计算 sizeof(数组名) / sizeof(类型);
//
// int len = sizeof(ps2) / sizeof(struct Person);
//
// printf("len = %d \n",len);//10
*/
//验证NULL就是0 NULL == 0 == '\0'
/*
if (NULL == 0) {
printf("周老师永恒的帅\n");
}else{
printf("高老师永恒的帅\n");
}
*/
//调用返回值是结构体的函数
/*
struct Person p = getPerson(); //现在p就接收了这个函数返回的结构体变量
printPerson( p );
*/
return 0;
}
|
|