C 二维数组,以及自定义二维数组

我们通常情况下是这样定义一个二维数组的:

int a[10][15];

我们分别查看一下a,a[0],*a

都是一样的值吧

我们可以这么理解: a是一个数组的数组

a是数组首元素的地址,a的首元素是一个15个元素的数组,a[0]和a[0]的首元素(a[0][0])的地址是同一个地址

所以有人可能会想int **pa 是不是 跟a同一个类型的

我们可以尝试下面的代码:

int a[4][2]=0x1234;
int **ppa=a;
//尝试写入数据
**ppa=1;

我们发现段错误,说明出错了,而且ppa并不能代表a

我们把a,*a,**a,ppa,* ppa打印出来

a和ppa的值相同没问题,因为是指向同一个地址,*a仍然是a的首地址,*ppa直接解引用了

所以**ppa相当于向0x1234写入数据所以发生了段错误!

如果想理解好这个我们先看一下c语言多维数组的内存是什么样的:

实际上,在内存中,多维数组也是像一维数组一样是连续的,只不过我们把这个数组抽象了一下,

我们让这个数组的首地址赋值给一个int**指针,那么这个指针会认为是一个int*数组的地址

(就是一个数组里面保存的都是指针),所以这样解引用会发生错误

解决方法:

使用指向多维数组的指针:

int (*pa)[2];//注意和int *pa[2] 区别,后者是一个保存int*的数组

比如我们在函数传参的时候

这样会导致后面的2是固定的,编程的时候会受到一些限制

int func(int (*pa)[2],int l);

int (*p)[2]的理解:

int a[4][2];
int (*pa)[2]= a;
printf("%p\n",(char*)&pa[1]-(char*)pa);

自增一次多走了sizeof第二个维度的长度

如果是函数定义的话,也可以:

int func(int a[][2],int l)这样a第一个维度可以不是固定的,第二维度是固定的,也不是很方便,我们如果定义动态二维数组的话一般不适用多维数组,适用数组的数组

数组的数组(自定义二维数组):

就是用一个int**ppa来指向一个区域,这个区域内每一个元素都是一个指针,每一个指针都指向一个数组

const int col = 5;
const int row = 5;
int **t = (int **)malloc(col*sizeof(int*));
for(int i = 0;i<col;i++)t[i]=(int*)malloc(row*sizeof(int));

当然,我们也可以把这些不连续的小空间放在一起申请

int **t = (int **)malloc(col*sizeof(int*));
int *p = (int*)malloc(col*row*sizeof(int));
for(int i = 0;i < col;i++)t[i]=p+col*i;

转载于:https://www.cnblogs.com/stdpain/p/10494950.html

C 二维数组,以及自定义二维数组相关推荐

  1. php 数组改成索引数组_PHP 自定义集合与数组规范

    下面是我使用处理动态数组的一些规则.这差不多是一个关于数组设计的风格指南,但是把它添加到对象设计风格指南感觉不太对,因为不是所有的面向对象语言都有动态数组.本文中的示例是用 PHP 编写的,因为 PH ...

  2. 【数字图像处理与python】自定义三维数组转换为彩色图像、自定义二维数组转为灰度图像

    自定义三维数组转换为彩色图像 """自定义三维数组转换为彩色图像""" import skimage import numpy as np# ...

  3. vue uniapp如何将一个一维数组变成一个二维数组?自定义切割数组长度

    如何将一个一维数组变成一个二维数组 lengthlsit(str,length) { // str:需要切割的数组,length需要切割的长度//获取要切割的数组的长度var length= pars ...

  4. php 二维数组排序函数,php自定义二维数组排序函数array

    这次给大家带来php自定义二维数组排序函数array,php自定义二维数组排序函数array的注意事项有哪些,下面就是实战案例,一起来看一下. 这篇文章主要介绍了php自定义二维数组排序函数array ...

  5. Android 自定义二维码

    Android生成二维码使用的是zxing. 1.加入依赖,或者自己选择zxing版本:Releases · zxing/zxing · GitHub dependencies {...impleme ...

  6. vba二维数组初始化_VBA二维数组的基础介绍

    既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了.下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率.Sub Exchange() Dim t As S ...

  7. zxing使用byte数组生成二维码和解析二维码

    二维码的生成方法网上一搜一大堆,但基本都是直接以字符串进行生成,存储访问路径或一些简单的信息.然而有时就是有这么特殊的需求,需要使用二维码传输数据,数据量还比较大.数据量太大二维码不好生成和扫描,就想 ...

  8. java二维数组从键盘更改_互换二维数组的行列。要求数组的行数、列数以及各元素均从键盘输入;输出互换前数组内容和互换后数组内容。(要求循环输入进行测试)Java...

    1. 互换二维数组的行列.要求数组的行数.列数以及各元素均从键盘输入:输出互换前数组内容和互换后数组内容.(要求循环输入进行测试) package com.mingrisoft; import jav ...

  9. python读取文件中的数据为二维数组变量_Numpy 多维数据数组的实现

    numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时 ...

最新文章

  1. HP380G7服务器安装fedaro16的问题解决
  2. Orchard之模版开发
  3. 密码设置Android设备管理
  4. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?
  5. java 基本的文件读写
  6. 关闭防火墙和selinux
  7. 微软自家的.Net下的JavaScript引擎——ClearScript
  8. Linux一个命令创建多个目录:seq命令
  9. 安卓APP测试知识大全【面试储备】
  10. 机器学习基础(六)—— 交叉熵代价函数(cross-entropy error)
  11. 熄风的止颤的汤治疗帕金森的优势
  12. 使用python进行微博登陆
  13. 如何管理小米路由器后台
  14. [Python从零到壹] 一.为什么我们要学Python及基础语法详解
  15. 【C语言-11】Bingou! ~~~~三个数字从大到小排排坐~~
  16. js 格式化prettier配置_Prettier 代码格式化插件 -- 配置翻译
  17. 阿里云服务器安装并配置nginx代理转发请求
  18. Win8/Win10 Ctrl+Alt+方向键 屏幕显示翻转解决办法
  19. 【JavaWeb】JavaWeb与JavaWeb技术栈
  20. 罚单不断,长文揭秘第三方支付!

热门文章

  1. CodeForces 596B Wilbur and Array 贪心
  2. 解析华为MAS EIE系统硬件与软件结构
  3. html实现下拉跳转
  4. 【论文研读】Similarity of Neural Network Representations Revisited (ICML2019)
  5. 数据分析 - 跨境电商爬虫成长记 之 第三篇:完整的爬虫工作环节有哪些
  6. java简单人物介绍
  7. 工程数学 | 两种中值定理傻傻分不清
  8. 【数理知识】kronecker 克罗内克积
  9. html怎么消除上下间距,html上下间距怎么调-电脑自学网
  10. stp转obj, stp转stl转换小工具