在之前的内容中,我们学习了强制类型转换
、条件操作符
以及逗号表达式
,今天我们将继续往下学习,学习的主要内容有结构体(2
),以及对外部变量
进行仿真。好了,话不多说,开整!!!
结构体(2)
在前面的内容中,我们已经对结构体
进行了一定的介绍,并介绍了其最基本的定义和使用方法,大家不知道或者忘记的可以自行查看,链接如下:初始结构体,今天我们继续对其进行较为深入的学习。
多个结构体定义
结构体除了基本的定义方式外,其另一种定义方式如下所示:
struct Radar
{
int fc;
double B;
double Tp;
char type[20];
} radar1,radar2;
其中的radar1
、radar2
即是想要定义的结构体的名字
,这样就可以同时创建两个内容相同的结构体,那么此处定义的结构体和以前讲述的定义的结构体的方式有什么区别呢?区别就在于:
此处的定义的结构体为全局变量,之前创建的结构体为局部变量
重命名结构体的类
什么是结构体的类
呢?如上述所示的代码,我们所创建的结构体类
为Radar
,那此时我们想要给此结构体赋值就需要使用以下代码:
struct Radar radar = {******};
未免有些过长,因此我们可以重命名结构体的类,然后再对结构体赋值,如下述所示代码:
typedef struct Radar
{
int fc;
double B;
double Tp;
char type[20];
} Radar;
此时我们把结构体的类重新定义为Radar
,此时再对结构体初始化时就只需以下代码:
Radar radar1 = {50,20.5,22.336,"phase_ayy"};
看起来是不是比上面的简洁一些,测试代码如下:
#include<stdio.h>
typedef struct Radar
{
int fc;
double B;
double Tp;
char type[20];
} Radar;
int main()
{
Radar radar1 = {50,20.5,22.336,"phase_ayy"};
printf("%d\n",radar1.fc);
return 0;
}
保存编译运行,得到以下结果:
结构体的第二种访问方式
前面
的内容中,我们对于结构体中的内容都是“.”方式
即普通变量访问的方式进行数据读取
的,那么既然结构体为一种变量类型,其是不是也可以通过指针进行访问呢?又如何进行访问呢?下面进行验证。
既然仍以上述代码为例,我们定义了一个类型为Radar
的结构体,那么其对应的指针类型则应该为:
Radar* p = &rada1;
如果你存在疑惑,请回看该文章:基础学习3中指针变量的相关内容,此时我们 定义了一个指针变量p
,那么能否通过指针访问结构体呢?示例代码如下:
#include<stdio.h>
typedef struct Radar
{
int fc;
double B;
double Tp;
char type[20];
} Radar;
void print(Radar radar1)
{
printf("%s\n",radar1.type);
}
int main()
{
Radar radar1 = {50,20.5,22.336,"phase_ayy"};
Radar* p = &radar1;
printf("%s\n",p.type);
return 0;
}
编译运行,报错了:
提示我们p是一个指针,你是不是想用->,那么我们改成这个,再进行编译,发现编译成功:
由此,我们可知:
结构体可以通过指针进行访问
指针的访问方式为->
结构体传参方式选择
结构体
,作为多个不同变量的集合,当然也可以在函数中进行传递
,那么我们在实参与形参这一节中,介绍了传递参数的两种方式,可以选择传值
,也可以选择传址
,那么结构体是传值好呢还是传址好呢,我们来进行说明。
如以下代码:
#include<stdio.h>
typedef struct Radar
{
int fc;
double B;
double Tp;
char type[20];
} Radar;
void print(Radar radar1) //传过来为结构体的值,所以接收为结构体的值
{
printf("%s\n",radar1.type);
}
void print2(Radar* radar1)//传过来为结构体的地址,所以接收为指针变量
{
printf("%s\n",radar1->type);//结构体指针采用->方式访问
}
int main()
{
Radar radar1 = {50,20.5,22.336,"phase_ayy"};
print(radar1);
print2(&radar1);
return 0;
}
如上所示,我们定义了一个结构体,其中存放了一些值,然后自定义了两个函数用来打印结构体中的字符串。
两个自定义函数的之间的区别
就在与传入的内容不同
,print函数传递的是值,print2传递的是地址,那么这两种方式哪种好呢?在讲解之前,我们先看一下运行结果:
可以看到运行结果是一样的,那这有什么好坏之分呢?
当然有区别了,因为我们在之前的内容讲过,传值
的时候相当于是在内存中重新开辟了一段空间来存储所传递的值,然会自定义函数内部运算结束后,再销毁
,因此,如果结构体的内容过于丰富,就会在内存中占用大量的临时资源,这是我们不想看到的,而传址操作就不会开辟新的空间,而是通过内存中的地址,直接访问结构体中的对应内容
,所以建议:
结构体传址操作更好
既然传址,则需要使用->访问结构体中的内容
外部变量(补)
在C语言学习(四)这一节的学习内容中,我们学习了外部变量
的使用,但是由于我的编译配置问题,并未对其进行编译测试,今天我在此处,对那一节的内容进行编译测试,详细内容请见上述链接:
编译修复
为什么在引用外部变量
时会报错,其中的一个主要原因就是编译器的链接问题,我是在参考了这两篇文章之后,对其进行了一个地方的修改,修改之后就可以使用外部变量了,参考文章如下:
参考文章1
参考文章2
简单来说按如下方式进行操作:
进入该文件后将"${file}",
替换为:
"${fileDirname}\\*.c",//替换后的
至此,连接问题就解决了。
演示
我们首先定义一个外部的头文件,命名为extern.h
,然后在其内部定义两个变量如下:
int g_val = 2023;
double v_val = 3.1415926;
然后在测试文件中引入头文件
,并打印两个变量,代码如下:
#include<stdio.h>
#include"extern.h"
extern int g_val;
extern double v_val;
int main()
{
printf("g_val = %d\n v_val = %lf\n",g_val,v_val);
return 0;
}
编译查看结果如下:
以上就是外部变量
在其他函数中使用的方式了。
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!