心有灵犀一点通——初识结构体

结构体(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、结构体指针变量通过“->”号访问它的成员

 

 

该篇未讲到的知识点有一个:

对结构体变量的成员可以像普通变量一样进行各种运算,当然是根据其类型决定可以进行的运算。这个很简单,读者可以自行查阅书籍学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值