文档总结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 }

    推荐阅读