【C语言】结构体指针

自己当前能力的学习感悟与总结。
可能以后加深理解后,会发现当前的理解有偏差,甚至有错误。
请辩证的看待本文。

1 结构体

1.1 简介

C语言中有许多不同的基础类型,char,short,int,long等,可以用这些基础类型定义变量,定义数组,定义指针。
结构体是用户自定义的一种类型,里面可以用基础类型定义变量,定义数组,定义指针。
结构体的好处:
结构体有助于C语言面向对象编程。比如说想描述一个人的职业信息,可以自定义一个结构体类型,里面包含这个人的“姓名char name[]”,年龄“int age;”,“职业char job[]”,“年薪int annual_salary ”等。进行参数传递时,使用结构体,会更方便,更清晰。

1.2 定义方式

1.2.1 最基本的定义

struct Person
{
	char name[10];
	int age;
	char job[];
	int annual_salary;
};

struct叫做“关键字”,Person叫做“标识符”。
上面就自定义了一个结构体类型,类似char,short,int等。
可以用结构体类型,声明一个结构体,比如:

struct Person Lihua;

以上就是使用结构体类型,定义了一个叫“LiHua”的结构体。
在程序中使用“LiHua”结构体时,可以使用以下操作。

Lihua.name = "Lihua";
Lihua.age = 18;

Lihua.name = "Lihua";
这里只是表示结构体的使用方法。这样给字符数组赋值是错误的。
左边是字符数组,右边是字符串,并不相等。
将“字符串”赋值给“字符数组”的方法:
1 定义的时候,直接用字符串初始化
如:
char a[10] = "hello";
2 对字符数组中的字符进行逐个赋值。
如:
char a[10] = {'h','e','l','l','o'};
3 使用strcpy字符转赋值函数,推荐
如:
char a[10]; strcpy(a,"hello");
以上,并没有实际验证。

1.2.2 带typedef的定义

如:

typedef struct Person
{
	char name[10];
	int age;
	char job[];
	int annual_salary;
}Per;

先按“基本定义”定义一个“结构体类型struct Person”,再使用“别定义typedef”将struct Person定义为Per

所以声明一个结构体时,可以

Per Lihua;

就声明了一个Lihua的结构体。
使用方法不变。

1.2.3 定义即对象的方式

在“基本定义”的方式上演变
如:

struct Person
{
	char name[10];
	int age;
	char job[];
	int annual_salary;
}Lihua;

先按“基本定义”,定义一个“结构体类型”,然后声明一个“Lihua”的结构体。
“Lihua”的结构体可以直接使用,如:

Lihua.age = 18;
Lihua.annual_salary = 50;

因为是先定义一个“结构体类型”,又用这个“结构体类型”声明了一个“Lihua”的结构体。
所以可以用这个“结构体类型”去声明别的结构体,例声明一个“Xiaohong”的结构体。

struct Person Xiaohong;

1.2.4 定义即对象的指针方式(不常见)

实际应用中,常见的是第二种和第三种定义的方式。
第二种更常见。

2 结构体指针

有了变量类型char,short,int,就可以定义指向某变量类型的指针char * ,short * ,int * 。
同样,自定义一个结构体类型,也可以定义指向某结构体类型的结构体指针。

使用方法,如下:

//定义结构体类型(struct Person)(Per)
typedef struct Person
{
	char name[10];
	int age;
	char job[];
	int annual_salary;
}Per;

int main(void)
{
	Per Lihua;//用结构体类型定义一个Lihua的结构体
	//struct Person Lihua;//等效
	Lihua.age = 18;//访问结构体成员用`.`。

	Per *Lihua_dad;//定义指向Per类型的结构体指针,名为Lihua_dad
	Lihua_dad = &Lihua;//Lihua_dad和Lihua均为struct Person类型。左边是结构体指针,右边是结构体。将右边取地址,可赋值给左边。
	
	Lihua_dad->age = 20;//通过结构体指针,访问结构体的成员(应该是结构体指针的特殊用法)(用的最多)(通过结构体访问时,用`->`)
	//*(Lihua_dad+1) = 20;//应该是结构体指针的标准用法,符合指针用法(在结构体指针上,很少用)(理论可行)(未验证)
	//*(Lihua_dad).age = 20;//已验证
	//Lihua_dad[1] = 20;//指针类似数组的访问方法(理论可行)(未验证)
}


结构体指针在函数形参传递时,也类似
如:

//定义结构体类型(struct Person)(Per)
typedef struct Person
{
	char name[10];
	int age;
	char job[];
	int annual_salary;
}Per;
//子函数的声明
void year_over(Per *profile);


int main(void)
{
	Per Lihua;//用结构体类型定义一个Lihua的结构体
	Lihua.age = 18;//访问结构体成员用`.`。
	
	year_over(&Lihua);
	
}

//年结束,年龄加1
void year_over(Per *profile)
{
	//profile->age ++;
	profile->age = profile->age + 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值