结构体:新的类型(由任意若干个基本类型组成)
a1,a2,a3是AA这个结构体类型的个体,每个个体都有AA这个结构体里面的两个部件
嵌套调用,结构体嵌套数组里的元素就是结构体child类型的数据
x4是结构体AA类型的,a1,a2,a3也是结构体AA类型的,同一类型可以相等
只看变量声名的时候是无法判定他是不是指针的,要看结构体重命名命的是什么(像*D命的就是指针):m1的类型*C=D(指针)
非指针类型
typedef struct ChildInfo{ int age; float height; }C; typedef struct Parent{ int age; float height; C childs[2]; }P; int main() { //xiaobai,xiaohei是C这个结构体类型的个体(变量) C xiaobai,xiaohei; P k1; k1.childs[0] = xiaobai; k1.childs[1] = xiaohei; int a; printf("%d,%f\n",xiaohei.age, xiaobai.height); printf("%d,%f\n",k1.age, k1.height); return 0; }
三个空间
结构体嵌套数组里的元素就是结构体child类型的数据,一个C一共有8字节,有两个子结构体元素就是两个C里面的int float(共16字节),有三个就是三个
删除空间:标记为无效,再申请的话,老数据还在,只是吧空间占下了(再添加直接覆盖)
声明个空间不赋值,会给个随机值
指针类型
#include <stdlib.h>//申请空间和释放空间,内存管理 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //单个数据 代表数组 结构体指针 传参指针 typedef struct ChildInfo{ int age; float height; }C; typedef struct Parent{ int age; float height; C childs[2]; }P; int main() { C xiaobai,xiaohei; // &取地址符 C* m1= &xiaobai; C* m2= &xiaohei; //计算C的空间大小,用sizeof计算空间并申请,然后按照C类型的进行划分 //C类型有俩数据,两个四字节划分 C* m3= (C*)malloc(sizeof(C)); //为m3申请空间了却用不到,内存泄漏,所以释放掉 free(m3); //相同类型可以直接等 m3 = m2; return 0; }
m3 = m2; 之后,m3(申请完之后不用)本来指向的空间没人记录了,内存泄漏(内存明明有却用不上)
注:这个m3一开始申请到的空间有两个格格(图错误)
每个程序在内存运行中都是有自己的单独空间(区域)
某个程序运行时发生内存泄漏,把程序关掉内存泄漏就会被释放,不会对内存本身造成影响,电脑不会运行越来越慢
指针类型的数组
//指针类型的不用点 int s1 = m3->age; float s2 = m3->height; //定义一个数组,是指针类型(这个数组不是指针),里面的数组元素是指针 C* arr[3]; arr[0] = (C*)malloc( sizeof(C) ); arr[1] = (C*)malloc( sizeof(C) ); arr[2] = (C*)malloc( sizeof(C) );
指针成为数组
//f2是指针 int f1 = 10; int* f2 = &f1; //数组 12/4=3个 int类型 f2 = (int*)malloc(12); f2[0] = 11; f2[1] = 34; f2[2] = 14; printf("%d\n", f2[1]); //34
n星指针可以容纳若干个(n-1)星指针---int型
//f2是指针 int f1 = 10; int* f2 = &f1; //f2指针数组 f2 = (int*)malloc(12); f2[0] = 11; f2[1] = 34; f2[2] = 14; //一个int是4字节,他申请了8字节,前面的(int*)表名这个指针申请了什么类型的数据,malloc是个申请内存的函数 //就相当于申请了两个能存放int类型的内存地址 int* f3 = (int*)malloc(8); int** f4 = (int**)malloc(sizeof(int*) * 2 ); //一星指针=一星指针,两个指针指向相同 f4[0] = f2; f4[1] = f3; int*** f5 = (int***)malloc(sizeof(int**) * 4 ); //n星指针可以容纳若干个(n-1)星指针
一星指针:可以达到一维数组
f4双星指针,里面有两个一星指针(随机地址),二维数组(里面有两个一维数组)
三星指针:三位数组
n星指针:n维数组
n星指针可以容纳若干个(n-1)星指针---结构体型
C* m4 = (C*)malloc( sizeof(C) * 4 ); C** m5 = (C**)malloc( sizeof(C*) * 3 );
C一共是8字节,每次申请都要8字节(B)
结构体指针m4,m5都成为了数组,分别是一维、二维
指针可以具备多种形态,可以是数组也可以是单个数据。
总代码
#include <stdio.h> #include <stdlib.h> //申请空间和释放空间,内存管理 typedef struct ChildInfo{ int age; float height; }C; typedef struct Parent{ int age; float height; C childs[2]; }P; // short int long float double char 基本原子 int main() { C xiaobai,xiaohei; C* m1 = &xiaobai; C* m2 = &xiaohei; C* m3 = (C*)malloc( sizeof(C) ); // free(m3); m3 = m2; // int s1 = m3->age; float s2 = m3->height; // C* arr[3]; arr[0] = (C*)malloc( sizeof(C) ); arr[1] = (C*)malloc( sizeof(C) ); arr[2] = (C*)malloc( sizeof(C) ); int f1 = 10; int* f2 = &f1; f2 = (int*)malloc( 12 ); // f2[0] = 11; f2[1] = 34; f2[2] = 14; printf("%d\n", f2[1]); int* f3 = (int*)malloc( 8 ); // int** f4 = (int**)malloc( sizeof(int*) * 2 );// f4[0] = f2; f4[1] = f3;// int*** f5 = (int***)malloc( sizeof(int**) * 4 ); // n星指针可以容纳若干个(n-1)星指针 C* m4 = (C*)malloc( sizeof(C) * 4 ); // C** m5 = (C**)malloc( sizeof(C*) * 3 ); return 0; } /** 指针在这四个方向:单个数据 代表数组 结构体指针 传参指针,语法有差异,不一致 **/
标签:f2,--,malloc,int,m3,sizeof,指针,结构 From: https://blog.csdn.net/qq_73993301/article/details/143377925