详解C语言二级指针三种内存模型

2023-05-16

已剪辑自: https://mp.weixin.qq.com/s/EBoKOgoVFl751jPe_QEAlg

整理:李肖遥

二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别

第一种内存模型char *arr[]

若有如下定义

char *arr[] = {"abc", "def", "ghi"};

这种模型为二级指针的第一种内存模型,在理解的时候应该这样理解:定义了一个指针数组(char * []),数组的每个元素都是一个地址。

在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

char *tmp = NULL;

如果要打印这个数组,那么可以使用以下函数

int printAarray(char **pArray, int num)
{
  int i = 0;
  if (pArray == NULL)
  {
    return -1;
  }
  for (i = 0; i < num; i++)
  {
    printf("%s \n", pArray[i]);
  }
  return 0;
}

第二种内存模型char arr[][]

若有如下定义

char arr[3][5] = {"abc", "def", "ghi"};

这种模型为二级指针的第二种内存模型,在理解的时候应该这样理解:定义了一个二维数组,有3个(5个char)空间的存储变量。

在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

char tmp[5] = { 0 };

如果要打印这个数组,那么可以使用以下函数

nt printAarray(char pArray[][5], int num)
{
  int i = 0;
  if (pArray == NULL)
  {
    return -1;
  }
  for (i = 0; i < num; i++)
  {
    printf("%s \n", pArray[i]);
  }
  return 0;
}

第三种内存模型char **arr

若有如下定义

char **arr = (char *)malloc(100 * sizeof(char *));//char arr[400]
arr[0] = (char *)malloc(100 * sizeof(char));//char buf[100]
arr[1] = (char *)malloc(100 * sizeof(char));
arr[2] = (char *)malloc(100 * sizeof(char));
strcpy(arr[0], "abc");
strcpy(arr[1], "def");
strcpy(arr[2], "ghi");
···
for(int i = 0; i < 3; i++)
 if(arr[i] != NULL)
  free(arr[i]);
free(arr);

这种模型为二级指针的第二种内存模型,在理解的时候应该这样理解:定义了一个二级指针,二级指针就是指向指针的指针,其实就是开辟了100个指针空间,存放了100个地址。这种写法是第一种的简化写法

在使用的时候,若要使用中间量操作元素,那么此时中间量应该定义为

char *tmp = NULL

如果要打印这个数组,那么可以使用以下函数

{
  int i = 0;
  if (pArray == NULL)
{
    return -1;
  }
  for (i = 0; i < num; i++)
  {
    printf("%s \n", pArray[i]);
  }
  return 0;
}

例子

把第一种内存模型的数据排序,运算结果放到第三种内存模型中

#include "stdio.h"
#include "string.h"
#include "stdlib.h"


char **SortArrayAndGen3Mem(const char ** const myArray1, int num, char *str, int *myNum)
{
  char **p = NULL;
    p= (char **)malloc(num*sizeof(char *));
  if (myArray1==NULL || str==NULL|| myNum==NULL)
  {
    printf("传入参数错误\n");
    p = NULL;
    goto END;
  }
  *myNum = num;
  for (int i = 0; i < num;i++)
  {
    p[i] = NULL;
    p[i] = (char)malloc(50 * sizeof(char));
    memset(p[i], 0, sizeof(p[i]));
    if (p[i]==NULL)
    {
      printf("内存分配错误!\n");
      goto END;
    }
    strcpy(p[i], myArray1[i]);
  }
  char *tmp;
  for (int i = 0; i < num; i++)
  {
    for (int j = i + 1; j < num; j++)
    {
      if (strcmp(p[i],p[j])>0)
      {
        char *tmp = p[i];
        p[i] = p[j];
        p[j] = tmp;
      }
    }
  }
  for (int i = 0; i < num; i++)
  {
    printf("%s \n", myArray1[i]);
  }


END:
  return p;
}


//释放内存函数


void main()
{
  int i = 0;
  char **myArray3 = NULL;
  int num3 = 0;
  //第一种内存模型
  char *myArray[] = {"bbbbb", "aaaaa", "cccccc"};
  char *myp = "111111111111";


  myArray3 = SortArrayAndGen3Mem(myArray, 3, myp, &num3);


  for (i=0; i<num3; i++)
  {
    printf("%s \n", myArray3[i]);
  }


  system("pause");
}
#include "stdio.h"
#include "stdlib.h"
#include "string.h"


char **SortArrayAndGet3Mem(const char* const myArray1,int num,char *str,int *myNum);
int getArray(char ***newp,int num) ;
int freeArray(char ***newpfree,int num);
int sortTArray(char *p, int num);


void main()
{
  char **myArray3=NULL;
  int num3=0;
  char *myArray[]={"bbbb","aaa","cccc"};
  char *myp="111111111";
  myArray3=SortArrayAndGet3Mem(myArray,3,myp,&num3);
  system("pause");
}




char **SortArrayAndGet3Mem(const char** const myArray1,int num,char *str,int *myNum)
{
  int ret=0;
  char **p=NULL;
  int i=0;
  char **p1=NULL;
  p1=(char **)myArray1;
  ret=getArray(&p,num +1);
  for (i=0;i<num;i++)
  {
    strcpy(p[i],p1[i]);
  }
  strcpy(p[i], str);
  ret=sortTArray(p,num +1);
  for (i=0;i<num +1;i++)
  {
    printf("%s\n",p[i]);
  }
  ret=freeArray(&p,num +1);
  *myNum = num +1;
  return p;
}


int getArray(char ***newp,int num) 
{
  int i=0;
  int ret=0;
  char **tmp = NULL;
  tmp = (char **)malloc(num*sizeof(char *));
  for (i=0;i<num;i++)
  {
    tmp[i]=(char*)malloc(sizeof(char)*100);
  }
  *newp = tmp; //
  return 0;
}


//
int freeArray(char ***newpfree,int num)
{
  char **p=NULL;
  int i=0;
  int ret=0;
  p=*newpfree;
  for (i=0;i<num;i++)
  {
    free(p[i]);
  }
  free(p);
  *newpfree = NULL; //
  return ret;
}


//int sortTArray(char ***Arraystr, int num)
int sortTArray(char **Arraystr, int num)
{
  int i , j = 0; 
  for (i=0; i<num; i++)
  {
    for (j=i+1; j<num; j++)
    {
      if (strcmp((Arraystr)[i],(Arraystr)[j])>0)
      {
        char tmp[100];
        strcpy(tmp,(Arraystr)[i]);
        strcpy((Arraystr)[i],(Arraystr)[j]);
        strcpy((Arraystr)[j],tmp);
      }
    }
  }
  for (i=0;i<num;i++)
  {
    printf("%s\n",(Arraystr)[i]);
  }
  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解C语言二级指针三种内存模型 的相关文章

随机推荐

  • 谈谈汽车软件中间件(Autosar为例)

    文章目录 操作系统 xff0c 中间件 xff0c 应用软件 各司其职分工不同什么是汽车软件中间件 xff1f 汽车软件中间件有什么好处 xff1f 中间件的明星方案 AUTOSARAUTOSAR Adaptive拯救AUTOSAR技术细节
  • 深入浅出讲解低功耗蓝牙(BLE)协议栈

    已剪辑自 https www cnblogs com bluestorm p 12031957 html 详解BLE 空中包格式 兼BLE Link layer协议解析 https www cnblogs com iini p 897780
  • 常见通信协议

    文章目录 1 通信 与 通讯 傻傻分得清2 通讯协议2 1 HTTP HTTPS2 2 WebService REST2 3 CoAP 协议2 4 MQTT 协议 低带宽 2 5 DDS 协议 高可靠性 实时 2 6 AMQP 协议 互操作
  • 渲染业务领域全景图

    最近图形学应用领域愈发广泛 xff0c 根据我的理解 xff0c 制作了一张渲染相关业务全景图 xff0c 希望对大家的职业规划有一定帮助
  • 谈一谈AI对人工的取代

    文章目录 AI绘画现在达到了什么水平 xff1f 易用性怎么样 xff1f 缘起 xff1a 2015年 用文字画画 2021年 Dalle 与 开源社区的程序员们 openAI与它并不open的Dalle AI开源社区 Dream by
  • 推荐几个代码自动生成器

    文章目录 老的代码生成器的地址 xff1a https www cnblogs com skyme archive 2011 12 22 2297592 html https link zhihu com target 61 https 3
  • 开始做公众号的一些方法技巧总结

    文章目录 封面正文预览公众号文章排版公众号运营全攻略 xff08 理论篇 xff09 公众号运营全攻略 xff08 工具技巧篇 xff09 封面 因为公众号的封面是分两个尺寸的 在头条的封面会长一些 xff0c 比例为 xff08 2 35
  • 程序员需要建立的对技术、业务、行业、管理、投资的认知

    文章目录 作为 IT 行业的过来人 xff0c 你有什么话想对后辈说的 xff1f 谈谈程序员转型的事儿 xff08 1 程序员应该重视技术吗 xff09 到底什么是IT技术 xff1f 怎么找到自己的学习方向 xff1f 献给新手程序员最
  • 虚拟化技术在机载软件中的应用

    虚拟化技术在航空计算领域的应用 基于软件虚拟化技术的新一代航空机载软件设计
  • 如何判断一段程序是否是裸机程序?

    在嵌入式MCU领域 xff0c 一般将不移植操作系统直接烧录运行的程序称为裸机程序 一般来说 xff0c 非易失性存储 xff0c 时钟 xff0c 图形显示 xff0c 网络通讯 xff0c 用户I O设备 都需要硬件依赖 基于硬件基础
  • 单片机STM32有什么推荐的裸机编程架构

    作者 xff1a DBinary 链接 xff1a https www zhihu com question 438340661 answer 2735154401 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xf
  • 一文讲清微服务架构、分布式架构、微服务、SOA

    文章目录 四种软件架构 xff1a 单体架构 分布式架构 微服务架构 Serverless架构一 单体架构二 分布式应用三 微服务架构四 Serverless架构 微服务是什么 xff1f 一 单体软件二 面向服务架构三 微服务 SOA架构
  • 敏捷开发,持续集成/交付/部署, DevOps总结

    文章目录 敏捷开发入门教程一 迭代开发二 增量开发三 敏捷开发的好处3 1 早期交付3 2 降低风险 四 如何进行每一次迭代五 敏捷开发的价值观六 十二条原则七 参考链接 持续集成 交付 部署一 概念二 持续交付三 持续部署四 流程4 1
  • IC集成电路 测试与验证的区别?

    在数字IC中 xff0c 验证与测试完全是两个概念 验证是在pre silicon 阶段 xff0c 也就是流片之前 xff0c 随着设计一起进行的 验证的主要目的是保证芯片逻辑功能的正确性和功能的完备性 验证的一般流程如下 xff1a 测
  • EGL综述

    参考 xff1a https www khronos org registry EGL specs eglspec 1 5 pdf 什么是EGL EGL是支持多平台 多操作系统的 xff0c 比如安卓 Unix Windows等 为了扩展性
  • pcie的rc模式和ep模式有什么区别?

    pcie的rc模式和ep模式有什么区别 xff1f RC PCI Express root complex 在RC模式时 xff0c 使用PCIE类型1配置头 xff1b EP endpoint device 工作方式 在EP模式时 xff
  • Android程序员一年没上班该如何找工作

    前言 Android程序员老王在21年7月份向公司提出了离职 离职后老王觉得在上家工作那么久 xff0c 就想趁着这个机会好好放松一下 由于让自己休息了两个月在加上他自己存了一点积蓄 xff0c 导致后面半年时间都没有找工作面试 到了22年
  • 为什么C语言执行效率高,运行快?

    已剪辑自 https mp weixin qq com s JUucTzACS IFO3iTO77DhQ 简述 都说C语言编写的程序执行效率比较高 xff0c 那么到底高在哪里 xff0c 我们一块来学习学习 C语言由来 C语言源自于BCP
  • 嵌入式5个RTOS程序设计建议

    已剪辑自 https mp weixin qq com s cCgQ5nfGiQckyqkXKxWtLQ 今天聊一下RTOS应用程序设计的五个实践技巧 我在编写RTOS应用程序的过程中 xff0c 经常会遇到这些困难 xff0c 包括正确确
  • 详解C语言二级指针三种内存模型

    已剪辑自 https mp weixin qq com s EBoKOgoVFl751jPe QEAlg 整理 xff1a 李肖遥 二级指针相对于一级指针 xff0c 显得更难 xff0c 难在于指针和数组的混合 xff0c 定义不同类型的