吹风机,福气,itools-有爱俱乐部,让爱心充满这个世界

admin 3周前 ( 10-29 09:13 ) 0条评论
摘要: 在C语言程序开发中,有经验的程序员有时会定义只有一个数组成员的结构体,虽然语法简单,但是却常常让初学者感到迷惑:这么做有什么好处吗?struct ABC { unsigned lo...

在C言语程序开发中,有经悚然候选者验的程序员有时会界说只要一个数组成员的结构体,尽管语法简略,可是却常常让初学者感到利诱:这么做有什么优点吗?

struct ABC {
unsigned long array[MAX];
} abc;

这么做有什么优点吗?

答案是必定的,这样做主要有两个优点:一是便于值传递,二是便于后期扩展。

便利的数组值传递

看过我之前文章的读者应该理解,调用C言语函数时,假如将数组作为参数传递给函数,那么在被调用函数内部,数组常常会退化成指针。下面是一段C言语代码示例:

#include 
void fun(char arr[16])
{
printf("sizeof arr is %d\n", (int)sizeof(arr));
}
int main()
{
char a[16] = {0};
fun(a吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际);
return 0;
}

C言语代码示例

编译并履行上述C言语代码,得到如下输出:

# gcc t.c
# ./a.out声海盗
sizeof arr is 8

可见,在函数 fun() 内部,sizeof(arr) 并不等于数组长度 16,而是等于 8(指针长度,我的机器是 64 位的,指针占用内存空间为 8 个字节),这说明即便函数 fu丁香妈妈n() 的参数C言语代码清晰指定为 fun(char arr[16]),在函数内部,arr 仍是退化成指针了。

而假如将数组封装在结构体内部,将结构体作为乐刷客服电话参数,那么在函数内部,咱们仍然能够获得完好的数组,请看下面的C言语代码示例:

#include 
typedef struct{
char arr[16];
}String;
void fun(String *str)
{
printf("siz吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际eof arr is 吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际%d\n", (int)s卡卡拉女王izeof(克隆杀手str->arr));
}
int main()
{
Str吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际ing s;
fun(&s);
return 0;
}

将结构体作为参数

编译并履行上述C言语代码,得到如下输出:

# gcc t.c
# ./a.out
sizeof arr is 16

全部与预期共同。上面蚊子静的C言语代码有意将结构体 typedef 为 String,由于它的行为很像用于描绘字符串的“新类型”。读者应该理解,C言语中的数组是不支持直接赋值的:

char a[16], b[16];
...
a = b; // 不合法

可是借助于C言语的结构体语法,String 类型是能够直接赋值的,这使得编写代码便利不少:

String a, b = {1,2,3,4,5};
a = b; // 合法
printf("%d %d %d %d %d\n", a.arr[0], a.arr[1], a.a刘大锁rr[2],
a.arr[3], a.arr[4]);吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际
// 输出 1 2 3 4 5

便利后续扩展

便利后续扩展

C言语中的结构体可用于将一些根本类型的数据封装成一个具有内在联系的数据结构,而且结构体并不束缚自身成员的数目和占用内存空间的巨细,这样的特性使得在C语大地园园通言项目后续开发中添加数据便利不少。

例如,或许刚开始 fun() 办法需求完结的需求比较简略,或许它只需求接纳一个数组就能够:

void fun(char arr[]);
char a[16];
...
fun(a);

跟着项目的持续推动,咱们发现 fun() 函数不只需求数组 arr 的地址,还需求知道 arr 中终究有多少有用的数据,因而需求对 fun() 函数做如下修正:

void fun(char a捍卫萝卜应战39rr[], int size);
char a[16];
...
fun(a, size);

明显,假如一开始 fun() 函数接纳吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际到的参数是裸数组,那么在后续开发中,要扩展参数就必须修正 fun() 函数原型,相应的调用途申梵驳斥谣言也需求修正,假如 fun() 函数的调用途特别多,那么扩展作业将会无比苦楚,而且很简略犯错。

别的一个问题是,void fun(char arr[], 吹风机,福分,itools-有爱沙龙,让爱心充溢这个国际int size); 中的 arr 和 size 是对应联系,可是却没有语法规矩束缚这种对应联系,因而在杂乱的项目开发中,将数组 b 的 siz荣呆呆e 误认为是数组 a 的 size 运用的状况是极有或许存在的,这样的过错发现和排查都适当困难。

假如,咱们一开始就将数组封装在结构体里,在创立 fun虎尾轮的成效与效果() 函数时,其实并未添加多少作业量:

typedef struct{
char arr[16];
}String;
void fun(String *a);
String 花为谁红a;
...
fun(&a);

现在需求对 fun() 办法扩展,添加 size 参数:

typedef struct{
char arr[16];
int青岛够级英豪 size;
}String;
void fun(String *a);
String a;
...
fun(&a);

明显,仅有要做的便是为结构体 String 新增了一个 s采访尹国驹完好版视频ize 成员以及相应的办法完成,fu文娱大佬的自我养成n() 函数原型不动,因而一切调用 fun() 函数的代码也就不需求修正了,这样的扩展无疑是便利的。别的,size 和 arr 的对应联系由C言语结构体语法束缚,这也在最大程度上避免了程序员错用 size。

小结

C言语语法自身是十分简略的,代码自身是易懂的,可是简略的组合背面常常隐藏着程序员匠心的一面,这些组合常常能为项目开发带来意想不到的优点。

点个关草社区榴注再走吧

欢迎在谈论区一同评论,质疑。文章都是手打原创,每天最粗浅的介绍C言语、linux等嵌入式开发,喜欢我的文章就重视一邹继富波吧,能够看到最新更新和之前的文章哦。

未经许可,制止转载。

文章版权及转载声明:

作者:admin本文地址:http://lovecub50.com/articles/4294.html发布于 3周前 ( 10-29 09:13 )
文章转载或复制请以超链接形式并注明出处有爱俱乐部,让爱心充满这个世界