1结构体的定义
c语言已经提供了内置类型,如char,short,int,long,double等,但是只有这些内置类型还是不够的,假设我想描述学生的信息,或者是描述一本书,这时单一的内置类型是不行的。描述一个学生需要名字,年龄,学号,身高,体重等信息等等。C语言为了解决这个问题,增加了结构体这种自定义的数据类型,让程序员可以创造适合的类型。
结构是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的变量,如:标量,数组,指针,甚至其他的结构体。
2结构的声明
struct tag
{
member-list;
member-list;
}variable-list;
例如,用结构体来描述一个学生的信息:
struct Stu//创造出一个新的类型(自定义类型)
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//这里的分号不能丢
例如:
int main()
{
struct Student s1;
struct Student s2;
struct Student s3;
//s1,s2,s3是三个结构体变量(局部)
return 0;
}s4;//s4是全局变量
struct Student s7//全局
3结构体变量的定义和初始化
//代码1:变量的定义
struct Point
{
int x;
int y;
} p1;//声明类型同时定义变量p1
struct Point p2;//定义结构体变量p2
struct Point p3 = {10,20};
//代码二:初始化
struct Stu//声明类型
{
char name[15];//名字
int age;//年龄
} ;
struct Stu s1 = {"zhangsan",20};//初始化
struct Stu s2 = {.age=20,.name="lisi"};//指定顺序初始化
//代码三
struct Node
{
int data;
struct Point p;
struct Node* next;
} n1={10,{4,5},NULL};//结构体嵌套初始化
struct Node n2 = {20,{5,6},NULL};//结构体嵌套初始化
4,结构成员访问操作符
4.1结构体成员的直接访问
结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:
#include<stdio.h>
struct Point
{
int x;
int y;
} p={1,2};
int main()
{
printf("x: %d y:%d\n",p.x,p .y);
return 0;
}
再来看两个示例
#include<stdio.h>
//形式1
int main()
{
struct Student s1 = {age=30,name="lisi",hight=180,wight=75.5f};//初始化
printf("%s %d% d %.1f %s\n",s1.name,s1.age,s1.high,s1.wight,s1.id);
}
//形式2
/*struct S
{
char c;
int n;
};
struct B
{
struct S s;
int *p;
char arr[10];
float sc;
};
int main()
{
struct B b={{'w',99},NULL,"hehe",85.5f};
printf("%c\n",b.s.c);
return 0;
}*/
使用方法:结构体变量.成员名
4.2结构体成员的间接访问
使用方法:结构体指针->成员名
#include<stdio.h>
struct Point
{
int x;
int y;
};
int main()
{
struct Point p = {3,4};
struct Point *ptr = &p;
ptr->x = 10;
ptr->y = 20;
printf("x = %d y = %d\n",ptr->x,ptr->y);
return 0;
}
4.3两种方式综合举例:
#include<stdio.h>
#include<string.h>
struct Stu
{
char name[15];
int age;
};
void print_stu(struct Stu s)
{
printf("%s %d\n",s.name ,s.age );
}
void set_stu(struct Stu* ps)
{
strcpy(ps->name ,"lisi");
ps->age = 28;
}
int main()
{
struct Stu s = {"zhangsan",20};
print_stu(s);
set_stu(&s);
print_stu(s);
return 0;
}
5,typedef关键字介绍
在C语言中,typedef是一个关键字,主要用于为数据类型定义一个新的名称,这样可以使得代码更加简洁和易于阅读。
以下是一些使用`typedef`的示例和用途:
1,为基本数据类型定义新的类型名
`typedef`可以用于为基本数据类型定义新的类型名,例如:
typedef int myInt;
myInt value; // 相当于 int value;
在这个例子中,`myInt`被定义为一个新的类型名称,它与`int`具有相同的语义,这样做的好处是在代码的其他部分引用这个类型时,可以直接使用myInt,而不必写完整的类型名称int.
2,为自定义数据类型定义简洁的类型名称
也可以用于为自定义数据类型(如结构体、联合体和枚举类型)定义简洁的类型名称。
例如,假设我们有一个结构体:
struct Complex {
double image;
double real;
};
我们可以使用`typedef`为其定义一个简短的类型名称:
typedef struct Complex myComplex;
myComplex complexValue; // 相当于 struct Complex complexValue;
这样做可以使代码更加清晰,尤其是在处理复杂的类型声明时 [❷]
3. 为数组定义简洁的类型名称
`typedef`还可以用于为数组定义简洁的类型名称,
例如:
这使得声明和引用具有相同长度的数组变得更加容易
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr; // 相当于 int arr[100]
4, 为指针定义简洁的名称
`typedef`同样适用于为指针定义简洁的名称,例如:
typedef int* pInt;
pInt p; // 相当于 int* p;
这有助于简化指针声明和引用 [❷]
注意事项
在使用`typedef`时,需要注意以下几点:
-①`typedef`仅限于为类型定义符号名称,而`#define`不仅可以为类型定义别名,还能为常量定义别名
- ②在使用`typedef`定义结构体时,如果结构体中包含了指向该结构体的指针,需要特别注意语法问题。因为当结构体还未定义完成时,编译器可能无法识别其中的指针类型
总的来说,`typedef`在C语言中提供了一种灵活的方式来定义和使用类型,从而提高了代码的可读性和可维护性。