【C 语言】二级指针 内存模型图 ( 指针数组 | 二维数组 | 自定义二级指针内存 )

举报
韩曙亮 发表于 2022/01/14 00:56:24 2022/01/14
【摘要】 文章目录 前言一、指针数组二、二维数组三、自定义二维指针内存 前言 绘制如下 3 ...

前言

绘制如下 3 3 3 种二级指针的内存模型 :

// I. 指针数组
char *p1 []= {"12", "ab", "34"};

// II. 二维数组
char p2[3][4] = {"12", "ab", "34"};

// III. 自定义二维指针内存
int i = 0, num=3;
char **p3 = (char **) malloc(sizeof(char) * 3);
for(i = 0; i < num; i++)
{
	p[i] = (char *)malloc(sizeof (char) * 4);
	sprintf(p[i], "%d%d", i + 1, i + 1);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14




一、指针数组



绘制如下代码内存结构图 :

// I. 指针数组
char *p1[] = {"12", "ab", "34"};

  
 
  • 1
  • 2

指针数组 内存结构图 :

在 栈内存 中 , 是一个 指针数组 , 数组中有 3 3 3 个元素 , 都是指针数据类型 ;

指针 指向的 位置 是 全局区 的 常量区 ;

在这里插入图片描述





二、二维数组



绘制 二维数组 的内存模型图 :

// II. 二维数组
char p2[3][4] = {"12", "ab", "34"};

  
 
  • 1
  • 2

绘制结果如下 : 上述 二维数组 都在 栈内存中 ,

  • 每个 一维数组 都占 4 4 4 字节 ;
  • 一维数组中 , 默认值都为 ‘\0’ 字符 ;
  • 注意 栈内存 生长方向是 从 高地址 -> 低地址 ;
  • 注意 数组 的内存方向是从 低地址 -> 高地址 , p[0] 在低地址 , p[1] 在高地址 ;
  • 全局区存在 初始化时 涉及到 的 相应字符串 常量 ;

在这里插入图片描述





三、自定义二维指针内存



绘制 自定义二维指针内存 的内存模型图 :

// III. 自定义二维指针内存
int i = 0, num=3;
char **p3 = (char **) malloc(sizeof(char) * 3);
for(i = 0; i < num; i++)
{
	p[i] = (char *)malloc(sizeof (char) * 4);
	sprintf(p[i], "%d%d", i + 1, i + 1);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

绘制结果如下 : 栈内存 中 只有一个 二维指针 , 其指向的 一维指针 都在 堆内存中 , 一维指针 也是指向 堆内存 中的数据 ;

注意 指针 指向 的是 内存块的 低地址 , 不要指错了位置 ;

全局区 中的 常量区 中 , 存在初始化的 字符串 常量 数据 ;

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121585822

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。