文档总结20-C语言中的二维指针和结构体
一、二维数组与二维指针
1. volatile
volatile是一个类型修饰符(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
2. 二维数组
数组名是数组第一个元素的首地址,也就是arr == &arr[0]
arr[0]是第二维的数组名也就是arr[0] == &arr[0][0]
arr[0][0]是元素名,与地址无关
3.一重指针和二维数组匹配
指针数组、数组指针和二维数组匹配
二重指针:指向的对象是一个指针,该指针指向int类型
定义指针
int **p,*p1;
绑定
p = &p1;
二、结构体 基本数据结构,数据和一种数据结构(缺点:元素单一)
结构体是一种数据结构,解决了数组里不能存放多种类型的数据这种缺陷。
#include
//结构体的关键字
struct infor//struct infor 是标识符,必须整体数用
{
char name[50];
//(元素)成员变量(属性)
char is_male;
int age;
};
//分号不能少不占空间
typedef struct infor S;
int main(void)
{
printf("sizeof(S) = %d\n",sizeof(S));
定义了一个结构体变量
S s = {"吕科", 1, 17};
//遍历元素,运算符(.)是专用于结构体变量访问各元素
printf("结构体元素:%d %d %s\n", s.is_male, s.age, s.mame);
S s1;
//赋值各成员变量
//.符号访问到结构体的成员变量名
strcpy(s1.male, "吕科");
s1.age = 17;
s1.is_name = 1;
//初始化,和数组很像,逐个赋值
S s2 = {1,2};
}struct
{
}S;
这个S是变量名的意思;
定义类型的同时给出了结构体的变量名//结构体里.号的实质
//&s类型是struct st *
int *p_a = (int *)&s;
//float *p_b = (float *)((char *)&s+4);
float *p_b = (float *)((long)&s+4);
//分析:地址值转化为数字,可加减。struct st s1;
//相同结构体变量之间可以相互赋值,在C++中被成为:赋值构造
s1 = s;
结构体数组
struct st arr[3];
结构体指针
struct st *p;
struct st s;
func(&s);
调用函数赋值
void func(struct st *p)
{
p->a = 1;
p->b = 3.14;
p->c = 2;
}
三、结构体的字节对齐规则
【文档总结20-C语言中的二维指针和结构体】1、结构体变量的地址是从4字节对齐的位置开始(0,4,8,c)
2、各成员在结构体里自身要对齐
3、成员之间不满足自身对齐,需要填充(padding)
4、满足结构体自身对齐的最小倍数
默认是4字节对齐,最大的基本数据类型和这个默认值相比,取其小
#include
int main()
{
struct str1// 7
{
int a;
// 4
char b;
// 1 + 1
short c;
// 2
}s1;
// 8struct str2
{
char a;
// 1
char b;
// 1
// + 2
int c;
// 4
}s2;
// 8struct str3// 6
{
int a;
char b;
char c;
// + 2
}s3;
// 8
struct str4
{
char a;
short b;
short c;
}s4;
//6
}
推荐阅读
- 7.9号工作总结~司硕
- ts泛型使用举例
- 最有效的时间管理工具(赢效率手册和总结笔记)
- 数据库总结语句
- 周总结|周总结 感悟
- 周总结43
- 参加【21天写作挑战赛】,第七期第14天,挑战感受小总结
- 第二阶段day1总结
- 新梦想91期特训班两天一晚学习感想及总结(学生(魏森林))
- 周总结(10.5-10.11)