C语言结构体与结构体指针的使用

2022-11-30 20:39:29 浏览数 (2)

C语言结构体与结构体指针的使用

tips:最近要好好学习一下数据结构,所以必不可少的就是c语言的结构体和结构体指针了,所以就整理一下这些基础知识

c语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。说的通俗一点就是一个集合。c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有点异曲同工之处了。下面回归正题,学习一下结构体以及结构体指针的知识。

一、结构体变量的定义和初始化

1、首先我们来看一下结构体的定义

代码语言:javascript复制
	struct 结构体名
	{
		成员列表;
	};//不要漏掉这里的分号!

  
  1234
代码语言:javascript复制
//结构体的定义
struct student
{
	int num;
	char name[20];
	char sex;
};

  
  1234567

在这里我们要区别一下结构体名和变量名,结构体名是一种类型,不能被当成变量名来使用

变量名声明方法: 1)struct 结构体名 结构体变量名; 2)直接在定义结构体的时候添加变量名的声明

代码语言:javascript复制
//在main()中定义及初始化
struct student st1 = {1001,"wr",'m'};

  
  12
代码语言:javascript复制
//结构体的定义以及初始化
struct student
{
	int num;
	char name[20];
	char sex;
}st2 = { 1002,"wr",'m' };

  
  1234567
代码语言:javascript复制
//用scanf()方法对结构体变量初始化
struct student st3;
scanf("%d %s %c",&st3.num,st3.name,&st3.sex);//对于数组,scanf输入的时候不用"&"

  
  123

结构的变量的访问(输出)

代码语言:javascript复制
printf("%d,%s,%cn", st1.num, st1.name, st1.sex);

  
  1

2.结构体数组的定义及初始化

代码语言:javascript复制
	struct student sarr[3];//定义结构体数组
	//循环初始化
	for (int i = 0; i < 3; i  )
	{
		scanf("%d %s %c",&sarr[i].num,sarr[i].name,&sarr[i].sex);
	}
	//测试输出
	for (int i = 0; i < 3; i  )
	{
		printf("%d,%s,%cn", sarr[i].num,sarr[i].name,sarr[i].sex);
	}

  
  1234567891011

二、结构体指针的使用

1.结构体指针的定义方法 1)struct 结构体名 *指针; 2)直接在定义结构体的时候添加结构体指针的声明

代码语言:javascript复制
//在main()方法中定义
struct student *p1;//定义结构体指针

  
  12
代码语言:javascript复制
struct student
{
	int num;
	char name[20];
	char sex;
}*p2;

  
  123456

2.利用结构体指针的访问结构体变量(输出)

结构体指针的访问变量方法 1)p->结构体成员; 2)(*p).结构体成员;

代码语言:javascript复制
//指针访问
struct student *p;//定义结构体指针
p=&st1;
printf("%d %s %cn",p->num,p->name,p->sex);

  
  1234
代码语言:javascript复制
//指针访问
struct student *p;//定义结构体指针
p=&st1;
printf("%d %s %cn", (*p).num, (*p).name, (*p).sex);

  
  1234

看了上面的基础知识是不是觉得比较简单:),下面让我们来分析一下两个特殊的结构体指针访问方法:) 1)p->num 2)p ->num 来看下面的例子 大家可以先不看注释,猜一下输出的结果:)

代码语言:javascript复制
#include <stdio.h>
#include <stdlib.h>
//定义结构体
struct student
{
	int num;
	char name[20];
	char sex;
};

int main() { //定义结构体数组 struct student sarr[3] = { 1001,“wr1”,‘m’,1003,“wr2”,‘m’,1005,“wr3”,‘m’ }; struct student *p;//定义结构体指针

代码语言:javascript复制
p <span class="token operator">=</span> sarr<span class="token punctuation">;</span><span class="token comment">//数组本身就是地址,不用取地址</span>
<span class="token keyword">int</span> num<span class="token punctuation">;</span>
num <span class="token operator">=</span> p<span class="token operator">-&gt;</span>num<span class="token operator">  </span><span class="token punctuation">;</span><span class="token comment">//num=p-&gt;num;p-&gt;num=p-&gt;num 1,优先级-&gt;的优先级高于  </span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"num=%d,p-&gt;num=%dn"</span><span class="token punctuation">,</span>num<span class="token punctuation">,</span>p<span class="token operator">-&gt;</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//p-&gt;num上一步已经加一</span>
num <span class="token operator">=</span> p<span class="token operator">  </span><span class="token operator">-&gt;</span>num<span class="token punctuation">;</span><span class="token comment">//num=p-&gt;num,p=p 1</span>
<span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"num=%d,p-&gt;num=%dn"</span><span class="token punctuation">,</span> num<span class="token punctuation">,</span> p<span class="token operator">-&gt;</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

下面来看看输出的结果 看看你猜对了嘛。。。


附:c语言常见运算符优先级

优先级

运算符

含义

结合方向

1

[]

数组下标

从左向右

()

圆括号

.

成员选择(对象)

->

成员选择(指针)

2

-

负号

从右向左

~

按位取反

自增

--

自减

*

取值

&

取地址

!

逻辑非

sizeof

数据类型长度

(类型)强制类型转换

强制类型转换

3

/

从左向右

*

%

取模

4

从左向右

-

5

<<

左移

从左向右

>>

右移

6

>

大于

从左向右

>=

大于等于

<

小于

<=

小于等于

7

==

等于

从左向右

!=

不等于

希望大家看了能够有所收获,加油!

tips:每一日你所付出的代价都比前一日高,因为你的生命又消短了一天,所以每一日你都要更积极。今天太宝贵,不应该为酸苦的忧虑和辛涩的悔恨所销蚀,抬起下巴,抓住今天,它不再回来。

0 人点赞