首页 > 其他分享 >指针--结构体指针

指针--结构体指针

时间:2024-10-31 16:16:10浏览次数:3  
标签:f2 -- malloc int m3 sizeof 指针 结构

结构体:新的类型(由任意若干个基本类型组成)

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

相关文章

  • 【优选算法】——二分查找!
    目录1、二分查找2、在排序数组中查找元素的第一个和最后一个位置3、搜索插入位置4、x的平方根5、山脉数组的封顶索引6、寻找峰值 7、寻找旋转排序数组中的最小值8、点名9、完结散花1、二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 targ......
  • 常见大模型——LLama系列
    LLaMA简介LLaMA(LargeLanguageModelMetaAI)是由Meta开发的一种大规模语言模型,旨在提高自然语言处理任务的性能。LLaMA基于Transformer机构,并经过大规模数据训练,以便在多种语言任务中表现出色。LLaMA所采用的Transformer结构和细节,与标准的Transformer结构不同的地方是包......
  • 深拷贝与浅拷贝
    ShallowcopyingBecauseC++doesnotknowmuchaboutyourclass,thedefaultcopyconstructoranddefaultassignmentoperatorsitprovidesuseacopyingmethodknownasamemberwisecopy(alsoknownasashallowcopy).ThismeansthatC++copieseachmemb......
  • openwrt解决docker拉取失败问题
    非原创,原文链接:loveyu.org/6115.html背景:在openwrt上的docker拉取失败,提示如下错误:root@openwrt:\~#dockerpulldebianErrorresponsefromdaemon:Get"https://registry-1.docker.io/v2/":contextdeadlineexceeded(Client.Timeoutexceededwhileawaitingheade......
  • 快速幂和大数取模的简单运用(以SPOJ LASTDIG - The last digit为例)
    题目描述原文Nestorwasdoingtheworkofhismathclassaboutthreedaysbutheistiredofmakeoperationsalotandheshoulddeliverhistasktomorrow.Hismath’steachergiveshimtwonumbersaandb.Theproblemconsistoffindingthelastdigito......
  • 项目经理如何处理项目中的道德和合规问题
    项目经理处理项目中的道德和合规问题首先需要明确项目合规标准、设立道德规范、开展全面风险评估、及时沟通并采取行动。项目经理的角色不仅要确保项目顺利实施,还需维护企业和项目组的道德标准、遵守相关法律法规。一项重要的工作是设立明确的道德规范,确保团队成员知晓并遵循。这......
  • 图书管理系统
    1.图书管理代理背景使用DjangoV3.2版本,搭建图书管理功能:图书(作者/出版社/书籍)增删改查功能数据库:mysql数据表:book(数据表)publish(出版社表)author(作者表)包含功能(参数)DjangoORM:单表,一对一,一对多,多对多增删改查views:控制代码逻辑,数据库操作models:创建数据表urls:路由......
  • 常用极限定理
    1.数列运算法则假设\(lim_{x\to\infty}x_n=a\),\(lim_{y\to\infty}y_n=b\)(1)\(lim_{n\to\infty}(x_n+y_n)=lim_{n\to\infty}x_n+lim_{n\to\inftyy_n}=a+b\)(减法,乘法同)(2)\(lim_{n\to\infty}\frac{x_n}{y_n}=\frac{lim_{n\to\infty}x_......
  • 程序员的修炼之道
    前篇读后感在《程序员修炼之道》的前半部分,我深刻感受到了编程语言的熟练掌握对于程序员的重要性。书中详细阐述了编程语言的基础知识,如语法、变量、数组等,以及在实际编程中需要掌握的各种概念和技术,如循环、条件语句、函数等。这些内容让我意识到,只有深入理解了编程语言,才能更有......
  • 实验2
    task1.cpp 1//类T:实现2//普通函数实现34#include"t.h"5#include<iostream>6#include<string>78usingstd::cout;9usingstd::endl;10usingstd::string;1112//static成员数据类外初始化13conststd::stringT::doc{"......