【C语言天天练(十)】结构体

引言:数据经常以成组的形式存在。在C中,使用结构可以把不同类型的值存放在一起。

结构的声明有两种

1、struct SIMPLE{

int a;

char b;

float c;

};然后用标签SIMPLE去声明结构体变量。

2、typedef struct{

int a;

char b;

float c;

}Simple;然后用Simple去声明结构体变量。此时Simple是个类型名,而不像上面的SIMPLE是个标签。

结构成员可以是标量、数组、指针甚至是其他结构。

结构成员的直接访问用点操作符(.)访问。例如Simple a;a.a或a.b或a.c。

结构成员的间接访问用->操作符访问,它是针对结构指针使用的。例如Simple *a;a->a或a->b或a->c。

结构的自引用是结构的成员里包含结构本身,但这种包含不能是直接包含,而应该包含的是指向该结构的指针。

结构作为函数参数时,一般使用指向结构的指针。向函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改。如果不希望如此,可以在函数使用const关键字来防止这类修改。而且,传递结构指针比传递结构本身更有效率。

总结:

1、具有相同成员列表的结构声明产生不同类型的变量。

2、使用typedef为一个子引用的结构定义名字时应该小心。

3、向函数传递结构参数是低效的。

4、把结构标签声明和结构的typedef声明放在头文件中,当源文件需要这些声明时可以通过#include指令包含。

5、结构成员的最佳排列形式并不一定就是考虑边界对齐而浪费内存空间最少的那种排列形式。

【C语言天天练(十)】结构体

时间: 2024-12-15 06:49:18

【C语言天天练(十)】结构体的相关文章

【C语言天天练(十九)】restrict关键词

引言:在内核的系统调用函数里,经常遇到函数的参数使用restrict限定词限定的情况,下面就对该关键词做个总结. 1.restrict关键词是C99特性才添加的,因此在编译使用含有该限定词的程序时,一定要在后边添加-std=c99的标志,使得gcc能够支持c99标准. 2.restrict既然是个限定词,那么它限定什么变量呢?它只能限定指针变量!经过它限定的数据对象,表明指针时访问该数据对象的唯一且初始的方式.注意:这里的唯一表明了,由它限定的指针所指向的数据块,只能由该指针访问,不能由除它之外

【C语言天天练(十二)】命令行参数

C程序的main函数具有两个形参.第1个通常称为argc,它表示命令行参数的数目.第2个通常称为argv,它指向一组参数值. 指针数组:这个数组的每个元素都是一个字符指针,数组的末尾是一个NULL指针.argc的值和这个NULL值都用于确定实际传递了多少个参数.argv指向数组的第1个元素,这就是它为什么被声明为一个指向字符的指针的指针的原因.注意:通常第1个参数就是程序的名称. 示例: #include <stdio.h> int main(int argc, char **argv) {

【C语言天天练(十八)】字符/字符串输入函数fgetc、fgets、getc、getchar和gets

#include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE *stream); int getc(FILE *stream); int getchar(void); char *gets(char *s); fgetc()读取文件指针stream所指向文件的下一个字符,返回值是所读取字符强制类型转换成整数的值,如果到达文件尾部或者出错,则返回EOF. getc()与fgetc()函数相同,只是它

【C语言天天练(十五)】字符串输入函数fgets、gets和scanf

引言:如果想把一个字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串. 读取字符串输入的第一件事是建立一个空间以存放读入的字符串. char *name; scanf("%s", name); 这段代码虽然可能通过编译,但因为name可以指向任何地方,所以它的输入值可能覆盖以前name所指位置的值. 解决办法是声明一个固定大小的字符数组,或者使用C库里的分配存储空间的函数. 1.gets函数从系统标准输入获得一个字符串,读取字符串直到遇到一个换行符(\n)

【C语言天天练(十六)】字符串输出函数puts、fputs和printf

C有三个用于输出字符串的标准库函数puts().fputs()和printf(). 1.puts()函数只需要给出字符串参数的地址. #include <stdio.h> int puts(const char *s); 示例: #include <stdio.h> #define DEF "I am libing" int main(int argc, char **argv) { char str1[30] = "I am libing."

【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易.本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>). 1.一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值.但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取

【C语言天天练(十四)】const关键字详解

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,了解const的作用,在看别人的代码时,对理解对方的程序有一定帮助. 1.const可以理解成是"只读变量"的限定词,从这里可以看出,const修饰的是变量,跟常量是不同的,常量是被编译器放在内存中的只读区域,当然也就不能够去修改它.而"只读变量"则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改.const就是用来限定一

【C语言天天练(三)】函数

对于程序来讲,函数的地位是不言而喻的.下面先给出函数的定义,然后根据定义分析C语言中的函数. 函数定义: 类型 函数名(形式参数) 代码块 由定义可以看出函数主要包括四部分:函数类型.函数名.函数形参.函数代码块. 函数类型:指明了函数返回值的类型,是整数.浮点数.指针甚至是结构体等等.需要注意的两点:1.如果类型是void,则没有返回值.如果是void *型的返回值,那可以返回任意类型的指针,这是ANSI C标准定义的,void *可以是任意类型的指针.2.返回值的类型应该与函数定义的类型相同

【C语言天天练(二三)】errno变量

引言: 在C编程中,errno是个不可缺少的变量,特别是在网络编程中.如果你没有用过errno,那只能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举,他更多的是个技巧,而不是架构上的需要.我们观察下函数结构,可以发现,函数的参数返回值只有一个,这个返回值一般可以携带错误信息,比如负数表示错误,而正数表述正确的返回值,比如recv函数.但是对于一些返回指针的函数,如:char *get_str():这个方法显然没有用的.NULL可以表示发生错误,但是发生什么错误却