结构体(structre):用户自己建立的,由不同类型数据组成放入组合型的数据结构。
下面我们声明一个结构体名为Student的结构体类型,有2个成员,char型和int 型
struct Student
{
char name[20];
int age;
}
我们由下面这张图对其进行详细分析:
声明完成后,我们就可以使用这个数据类型,定义结构体变量并对其成员赋值,如:
具体的操作和分析如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
char name[20];
int age;
};
int main()
{
struct Student A; // 1
struct Student B = {"liubei", 25}; // 2
struct Student C = {"caocao"}; // 3
C.age = 30; // 4
strcpy(C.name, "sunquan"); // 5
struct Student *p = &B; // 6
(*p).age = 35; // 7
p -> age = 35; // 8
return 0;
}
1、定义结构体变量A
2、定义结构体变量B,同时对其成员变量进行初始化
3、未被指定初始化的数值型成员被系统初始化为0;字符型成员被系统初始化为“\0”,指针型成员被系统初始化为“NULL”
4、结构体普通变量通过“.”访问其成员,“. ”是结构体成员运算符
5、对字符型的成员,若要更改其值不能直接进行赋值,如:C.name = “sunquan”是错误的,因为字符串常量不能直接修改其值。这里,我们应该用字符串拷贝函数:strcpy来解决这一问题。这里不用担心字符串拷贝会因前面的字符串长度太小而导致越界,因为该成员变量的长度为20个字节,是足够放下新的字符串的。,该语句将结构体变量C中的“caocao”改为了“sunquan”
6、 定义一个该结构体类型的指针变量p,保存结构体变量B的地址
7、通过指针p来访问并修改B . age 的值,将25改为了35。注意:由于 “ . ” 的优先级大于“ * ”,所以前面的()不能省略
8、该语句的作用和语句7是相同的,并且这里我们认识了一个新的符号“-> ”,结构体指针变量通过“->”号访问它的成员
另外:
“ -> ”和“ [ ] ”一样,都是自带解引用的,由上面的分析我们也可以看出来。也就是说,我们若想通过子函数来修改父函数中结构体变量中的成员的值,同样就需要传指针和解引用,而解引用的步骤在“->”这个符号里是自带的。
让我们通过下面这个程序来说明:
#include<stdio.h>
struct Student
{
char name[20];
int age;
};
void show_01(struct Student n )
{
n.age = 0;
}
void show_02(struct Student *n )
{
n -> age = 0;
}
int main()
{
struct Student A = {"xiaobai",20};
show_01(A);
printf("%d\n",A.age);
struct Student *p = &A;
show_02(p);
printf("%d\n",A.age);
return 0;
}
其输出结果为:
结果不出所料,子函数show_01由于没有传指针和解引用,自然修改不了父函数里A.age 的值,而show_02 可以将其改为 0 。
这里还有一个知识点就是,输出结构体变量中的成员时,只能用不同的输出格式输出相应的成员,如:
printf(“%s ,%d\n”, A.name , A.age); //正确
不能企图用结构体变量名来输出其中的所有成员:
printf(“%s\n”, A); //错误
printf(“%d\n”, A); //错误
printf(“%s ,%d\n”, A); //错误
最后,我们来做一个练习。程序如下:
#include<stdio.h>
struct test_01
{
int a;
int *b;
};
struct test_02
{
int c;
int *d;
struct test_01 e;
};
int main()
{
struct test_02 aa;
struct test_02 *bb = &aa;
return 0;
}
问题是:如何分别通过aa和bb访问到a,b,c,d四个成员?(该题目会产生野指针,我们不必理会,我们只是为了掌握访问结构体成员的方法。)
这个问题是很简单的,答案如下:
aa.e.a;
aa.e.b;
aa.c;
aa.d;
bb->e.a;
bb->e.b;
bb->c;
bb->d;
其运用到的知识有:
1、 如果成员本身有属于一个结构体类型,则要用若干个成员运算符“ . ”一级一级地找到最低一级的成员
2、结构体指针变量通过“->”号访问它的成员
该篇未讲到的知识点有一个:
对结构体变量的成员可以像普通变量一样进行各种运算,当然是根据其类型决定可以进行的运算。这个很简单,读者可以自行查阅书籍学习。