C语言中对结构体变量不同的引用方式分析 “->” 指向与 '. '指向及相关辨析
引言
在对结构体变量的引用方式中,有两种最为常见的方式,一种是箭头(->)方式的引用,另一种就是点(.)方式的引用,对于这两种引用方式是有着本质上的区别的,因此我们需要真正弄懂这里边的原理。
代码示例
代码功能描述
定义一个结构体,初始化结构体的值,并输出,然后通过两种不同的方式修改结构体变量的值,最后再次输出修改后的值(这里的修改结构体变量的值并不是手动修改代码,而是在不同的函数中实现的)。
代码如下
#include"stdio.h"
#include"stdlib.h"
//定义一个引例结构体
typedef struct
{
int val;
char ch;
}example;
//"->"是对结构体指针变量的引用
void Example_1(example* p,int n,char a)
{
p->val=n;
p->ch=a;
}
//"."是对普通结构体变量的引用
void Example_2(example p,int n,char a)
{
p.val=n;
p.ch=a;
}
void main()
{
example* temp_1;//定义结构体指针
example temp_2;//定义普通结构体变量
temp_1=(example *)malloc(sizeof(example));
temp_1->val=11;
temp_2.val=22;
printf("修改前输出\ntemp_1->int:%d temp_2->int:%d\n\n",temp_1->val,temp_2.val);
Example_1(temp_1,33,'a');
Example_2(temp_2,44,'b');
printf("修改前输出\ntemp_1->int:%d temp_1->char:%c\n",temp_1->val,temp_1->ch);
printf("temp_2->int:%d temp_2->char:%c\n\n",temp_2.val,temp_2.ch);
//由输出结果可知,函数参数通过普通结构体传入时,无法通过函数改变结构体变量的值
//当函数参数通过结构体指针传入时,能够将结构体变量改变后的值传出
//这一点与普通指针作参数时的效果相同
}
输出
修改前输出
temp_1->int:11 temp_2->int:22
修改后输出
temp_1->int:33 temp_1->char:a
temp_2->int:22 temp_2->char:?
Press any key to continue
分析
首先来分析代码部分,看从代码部分我们能得到哪些结论。通过观察主函数,我们可以看到,在定义两个结构体时,我们采用了两种不同的方式去定义,第一个是通过指针的方式定义结构体,而第二个是通过基本方法定义结构体的,这里也是不同引用方式的最大的一个区别,就是一个是对结构体指针变量的引用(也就是->),而一个是对一般变量的引用(也就是.)。
接着我们来分析输出的代码,能找到什么问题。我们在主函数中初始化了部分结构体变量的数值,并且在不同的引用方式的函数中修改了最开始初始化的一些数值,在控制台输出中我们可以看到,第二次输出的结果其中通过一般方式的引用的输出结果并不是我们所预料的那样,而是输出了一个’?',这就表示我们的修改结果并未成功。通过指针方式引用修改成功了,而通过一般方式引用的修改失败了,相信到这里很多小伙伴已经知道问题所在了,还是指针的性质,函数传参的原因。
好了,关于结构体变量的两种引用方式到这里就介绍完毕了,如果有不懂的地方欢迎在评论区留言发表你的看法~