文档总结20-C语言中的二维指针和结构体

来源:互联网 发布:视频剪辑for mac 编辑:程序博客网 时间:2024/05/17 23:19

一、二维数组与二维指针

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<stdio.h>//结构体的关键字 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;}

三、结构体的字节对齐规则

1、结构体变量的地址是从4字节对齐的位置开始(0,4,8,c)
2、各成员在结构体里自身要对齐
3、成员之间不满足自身对齐,需要填充(padding)
4、满足结构体自身对齐的最小倍数
默认是4字节对齐,最大的基本数据类型和这个默认值相比,取其小

#include<stdio.h>int main(){    struct str1      // 7    {        int a;       // 4        char b;      // 1 + 1        short c;     // 2    }s1; // 8    struct str2    {        char a;     // 1        char b;     // 1                // + 2          int c;      // 4    }s2; // 8    struct str3         // 6    {        int a;        char b;        char c;                // + 2    }s3;  // 8    struct str4    {        char a;        short b;        short c;    }s4;    //6}
原创粉丝点击