C 二维数组,以及自定义二维数组
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 二维数组,以及自定义二维数组相关推荐
- php 数组改成索引数组_PHP 自定义集合与数组规范
下面是我使用处理动态数组的一些规则.这差不多是一个关于数组设计的风格指南,但是把它添加到对象设计风格指南感觉不太对,因为不是所有的面向对象语言都有动态数组.本文中的示例是用 PHP 编写的,因为 PH ...
- 【数字图像处理与python】自定义三维数组转换为彩色图像、自定义二维数组转为灰度图像
自定义三维数组转换为彩色图像 """自定义三维数组转换为彩色图像""" import skimage import numpy as np# ...
- vue uniapp如何将一个一维数组变成一个二维数组?自定义切割数组长度
如何将一个一维数组变成一个二维数组 lengthlsit(str,length) { // str:需要切割的数组,length需要切割的长度//获取要切割的数组的长度var length= pars ...
- php 二维数组排序函数,php自定义二维数组排序函数array
这次给大家带来php自定义二维数组排序函数array,php自定义二维数组排序函数array的注意事项有哪些,下面就是实战案例,一起来看一下. 这篇文章主要介绍了php自定义二维数组排序函数array ...
- Android 自定义二维码
Android生成二维码使用的是zxing. 1.加入依赖,或者自己选择zxing版本:Releases · zxing/zxing · GitHub dependencies {...impleme ...
- vba二维数组初始化_VBA二维数组的基础介绍
既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了.下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率.Sub Exchange() Dim t As S ...
- zxing使用byte数组生成二维码和解析二维码
二维码的生成方法网上一搜一大堆,但基本都是直接以字符串进行生成,存储访问路径或一些简单的信息.然而有时就是有这么特殊的需求,需要使用二维码传输数据,数据量还比较大.数据量太大二维码不好生成和扫描,就想 ...
- java二维数组从键盘更改_互换二维数组的行列。要求数组的行数、列数以及各元素均从键盘输入;输出互换前数组内容和互换后数组内容。(要求循环输入进行测试)Java...
1. 互换二维数组的行列.要求数组的行数.列数以及各元素均从键盘输入:输出互换前数组内容和互换后数组内容.(要求循环输入进行测试) package com.mingrisoft; import jav ...
- python读取文件中的数据为二维数组变量_Numpy 多维数据数组的实现
numpy包(模块)几乎总是用于Python中的数值计算.这个软件包为Python提供了高性能的向量.矩阵.张量数据类型.它是在C和Fortran中创建的,因此当计算被矢量化(用矩阵和矢量表示操作)时 ...
最新文章
- HP380G7服务器安装fedaro16的问题解决
- Orchard之模版开发
- 密码设置Android设备管理
- Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?
- java 基本的文件读写
- 关闭防火墙和selinux
- 微软自家的.Net下的JavaScript引擎——ClearScript
- Linux一个命令创建多个目录:seq命令
- 安卓APP测试知识大全【面试储备】
- 机器学习基础(六)—— 交叉熵代价函数(cross-entropy error)
- 熄风的止颤的汤治疗帕金森的优势
- 使用python进行微博登陆
- 如何管理小米路由器后台
- [Python从零到壹] 一.为什么我们要学Python及基础语法详解
- 【C语言-11】Bingou! ~~~~三个数字从大到小排排坐~~
- js 格式化prettier配置_Prettier 代码格式化插件 -- 配置翻译
- 阿里云服务器安装并配置nginx代理转发请求
- Win8/Win10 Ctrl+Alt+方向键 屏幕显示翻转解决办法
- 【JavaWeb】JavaWeb与JavaWeb技术栈
- 罚单不断,长文揭秘第三方支付!
热门文章
- CodeForces 596B Wilbur and Array 贪心
- 解析华为MAS EIE系统硬件与软件结构
- html实现下拉跳转
- 【论文研读】Similarity of Neural Network Representations Revisited (ICML2019)
- 数据分析 - 跨境电商爬虫成长记 之 第三篇:完整的爬虫工作环节有哪些
- java简单人物介绍
- 工程数学 | 两种中值定理傻傻分不清
- 【数理知识】kronecker 克罗内克积
- html怎么消除上下间距,html上下间距怎么调-电脑自学网
- stp转obj, stp转stl转换小工具