int *p ; 定义 p变量为int *型
此时,p代表地址,p为指针
*p 表示对p作了*运算,偏移空间后的基类型的值
**p 表示存放指针*p地址的地址
分清指针变量本身的类型 和 指向目标的数据的类型
1.指针本身的类型,去掉指针名称,剩下的就是指针本身的类型
2.指向目标的数据的类型,比指针本身的类型少一个*,因为这个*在定义指针
eg 图中 int *p = &a;指针p本身的类型为int *型,指针p指向目标的类型为int型。
int表示指向的空间(a)里存的数据类型为int,表示存放的基类型
*表示定义了一个指针变量,这块空间(p)要里存放一个地址数据
eg 图中int * * q = &p; 指针q本身的类型为int **型,指针q指向目标的类型为int*型
int*表示指向的空间(p)里存放的数据类型为int*型,表示存放的基类型
第二个*表示定义了一个指针变量q,这块空间(q)里要存放一个地址数据
f)int(*a)[10]);// a代表数组a[10]的首地址,对a进行*运算表示取了数组a[10]的首地址,所以为数组整体的指针 g)、h)同理。
11.结构体、共用体、枚举
结构体 struct:
描述一些原先基本数据类型不好描述的,这种复杂数据类型
语法:
struct 结构体类型名
{
数据成员列表;
};
eg: 描述学生这种类型:
struct student
{
char name[20]; //1.姓名
int age; //2.年龄
float sorce; //3.成绩
char sno; //4.学号
} ; //最后这个分号,表示结构体运行完成
int main(void)
{
struct student s;//定义出一个 学生类型的 变量s
}
注意:
1.结构体---用来实现 自定义数据类型
2.用结构体
a.先构造出数据类型
b.用数据类型定义变量、数组、指针等
访问结构体:
. //结构体成员运算符
结构体变量名 . 成员变量名
eg:
struct student s = {“tom,20,59,5,110”};
printf(“name = %s\n”,s.name);
-> //用于访问结构体成员变量 指针时用
eg:void printTeacherInfo(struct teacher *t)
{
printf("name = %s\n",t -> name);
}
结构体的对齐规则:
1.在32位的平台上,默认都是按4字节对齐的。64位的平台默认是8字节
2.对于成员变量,各自在自己的自然边界上对齐。
//整个结构体的对齐
3.如果成员变量中有比4字节大。
此时整个结构体按照4字节对齐。4.如果成员变量中没有有比4字节大。
此时整个结构体按照最大的那个成员对齐。