C语言提供结构体来管理不同类型的数据组合。C语言中的结构体类似于Java中的类。
声明结构体类型
定义变量名
定义变量名和初始化
结构体对齐
结构体的大小必须是其最大成员的整数倍!
(1)例如,此结构体的大小为16。因为double类型占8个字节,而short类型占2个字节,所以就以8个字节为最大成员单位,即使不满8字节也算作8字节。
(2)例如,此结构体的大小为16字节。因为double类型占8个字节,而int类型和short类型分别占4个字节和2个字节,所以就以8个字节为最大成员单位。并且int和short的大小加起来小于8字节,所以也只算作8字节。
6.结构体指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设置一个指针变量,用它指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址.指针变量也可以用来指向结构体数组中的元素,从而能够通过结构体指针快速访问结构体内的每个成员。
从下面代码中我们可以看到, p就是一个结构体指针,可以对结构体s取地址并赋给p,这样借助成员选择操作符,就可以通过p访问结构体的每个成员,然后进行打印.我们知道数组名中存储的是数据的首地址,所以可以将sarr赋给p,这样就可以通过两种方式访问对应的成员。
使用(*p).num访问成员为什么要加括号呢?原因是“.”成员选择的优先级高于“*”(即取值)运算符,所以必须加括号,通过*p得到sarr[0],然后获取对应的成员。
也可以指向
7.typedef的使用
typedef类似于取别名。
在下面的代码中,使用stu定义结构体变量和使用struct student定义结构体变量是等价的;使用INTEGER定义变量i和使用int定义变量i是等价的; pstu等价于struct student*,所以p是结构体指针变量。
8.C++的引用
引用是C++的语法,使用手法是在形参位置可以用&符号,c语言是不可以的,同时代码文件后缀需要是cpp才行。当我们在子函数改变主函数中某一个变量的值时,使用C++的引用操作起来非常方便,如果我们只是读取对应变量的值,而不改变,是不需要使用引用的。
下图1为加入了C++引用的代码
下图2为纯C语言代码
区别在于,C++使用“&”为引用符,取代原C语言中的“*”为指针符。
子函数内修改主函数的一级指针变量(这是是重要的! )
引用符号位置没关系,对于形参void modify_pointer(int*&p,int *q)我们不可以写为voidmodify_pointer(int &*p,int*q),因为引用符号必须和变量名直接相邻,中间不可以放入其他,否则会造成编译不通。
例题:
//当子函数要修改主函数中的p,那么就加引用。引用如何实现的,完全不需要去关心。
#include<stdio.h>
#include<stdlib.h>
void f1(char *&p)
{
p = (char *)malloc(100);
fgets(p,100,stdin);
}
int main()
{
char *p;
f1(p); //p中的值已经在子函数中被改变了,所以可以直接输出p的值。
puts(p);
free(p);
return 0;
}