C++声明指向数组的指针
一、问题
下面这些声明合法吗?
int vector[10], *vp = vector;int matrix[3][10], *mp=matrix,
二、答案
第1个声明是合法的。它为一个整型数组分配内存,并把vp声明为一个指向整型的指针,并把它初始化为指向 vector数组的第1个元素。 vector和vp具有相同的类型:指向整型的指针。
第2个声明是非法的。它正确地创建了 matrix数组,并把mp声明为一个指向整型的指针。但是,mp的初始化是不正确的,因为matrix并不是一个指向整型的指针,而是一个指向整型数组的指针。正确的初始化方法是
int matrix[3][10];
int (*mp)[10] = matrix;
三、如何声明一个指向整型数组的指针
int(*p)[10];
这个声明比我们以前见过的所有声明更为复杂,但它事实上并不是很难。你只要假定它是一个表达式并对它求值。下标引用的优先级高于间接访问,但由于括号的存在,首先执行的还是间接访问。所以,p是个指针,但它指向什么呢?接下来执行的是下标引用,所以p指向某种类型的数组。这个声明表达式中并没有更多的操作符,所以数组的每个元素都是整数。
声明并没有直接告诉你p是什么,但推断它的类型并不困难——当我们对它执行间接访问操作时,我们得到的是个数组,对该数组进行下标引用操作得到的是一个整型值。所以p是一个指向整型数组的指针。
我们在声明中加上初始化后是下面这个样子
int(*p)[10] = matrix;// 一个指针,它指向一个有10个int元素的数组
它使p指向matrix的第1行。
p是一个指向拥有10个整型元素的数组的指针。当你把p与一个整数相加时,该整数值首先根据10个整型值的长度进行调整,然后再执行加法。所以我们可以使用这个指针一行一行地在 matrix中移动。
四、实例
现在,我们来观察一个矩阵
int matrix[3][10] ;
...
Func(matrix);
这里,参数 matrix的类型是指向包含10个整型元素的数组的指针。Func的原型应该是怎样的呢?
我们可以使用下面两种形式中的任何一种
void Func( int (*mat)[10])
void Func( int mat[][10])
在这个函数中,mat的第1个下标根据包含10个元素的整型数组的长度进行调整,接着第2个下标根据整型的长度进行调整,这和原先的 matrIx数组一样。这里的关键在于编译器必须知道第2个及以后各维的长度,才能对各下标进行求值。因此在原型中必须声明这些维的长度。第1维的长度并不需要,因为在计算下标值时用不到它。在编写一维数组形参的函数原型时,你既可以把它写成数组的形式,也可以把它写成指针的形式。
但是,对于多维数组,只有第1维可以进行如此选择。尤其是,把Func写成下面这样的原型是不正确的。
void Func( int **mat,int row,int col)
它把mat声明为一个指向整型指针的指针,它和指向整型数组的指针并不是一回事。
可以进行强制转换如下调用。
Func((int**)matrix,3,3);
其他实例
在该例中,指向有 10 个 int 元素的数组的指针会被初始化为 NULL。然而,如果把合适数组的地址分配给它,那么表达式 *arrPtr 会获得数组,并且(*arrPtr)[i] 会获得索引值为 i 的数组元素。根据下标运算符的规则,表达式(*arrPtr)[i] 等同于 *((*arrPtr)+i)。因此,**arrPtr 获得数组的第一个元素,其索引值为 0。
int (* arrPtr)[10] = NULL; // 一个指针,它指向一个有10个int元素的数组 int matrix[3][10]; // 3行,10列的数组// 数组名称是一个指向第一个元素的指针,也就是第一行的指针arrPtr = matrix; // 使得arrPtr指向矩阵的第一行(*arrPtr)[0] = 5; // 将5赋值给第一行的第一个元素arrPtr[2][9] = 6; // 将6赋值给最后一行的最后一个元素++arrPtr; // 将指针移动到下一行(*arrPtr)[0] = 7; // 将7赋值给第二行的第一个元素
在前文 arrPtr 的声明语句(int(*arrPtr)[10]=NULL;)中,删除其中标识符 arrPtr,就可得到 int(*)[10],即对应的数组指针类型。然而,为了提高可读性和灵活性,可以利用 typedef 为所用的类型定义一个简单的名字:
typedef int ARRAY_t[10]; // 定义一个“具有10个元素数组”类型名称ARRAY_t array, // 具有该类型的数组*arrPtr; // 一个指向该数组类型的指针arrPtr = (ARRAY_t *)array; // 使得arrPtr指向array
参考:
C语言数组指针和指针数组
如何将二维数组作为函数的参数传递_manba-CSDN博客_二维数组 函数参数
C++声明指向数组的指针相关推荐
- C指针4:数组指针(指向数组的指针)
先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...
- 【 C 】指向数组的指针(数组指针)(行指针)
本博文内容参考:<C 和 指针> 本博文解决两个问题,一是如何访问二维数组的行,以及元素:二是如何定义指向数组的指针以及如何赋值等. 很简单,快速记录! 先给出一个案例,判断下面这两个声明 ...
- 指向数组的指针的理解
指向数组的指针的理解 开发工具与关键技术:Visual Studio.C++ 作者:张国军 撰写时间:2019年05月03日 数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值. ...
- 第五章 指向数组的指针
讲到第五章了,数组两个字还离不开我们的左右,数组的内容也真多,另一方面也因为数组与指针的关系的确非常密切. 通常,对于int a[8][9]这个二维数组,我们可以这样定义一个指向它的指针: int ( ...
- 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)
指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运 ...
- C和指针之指针数组和指向数组的指针
1.指针数组 定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义 int *p[10]; 2.指向数组的指针 定义一个数组指针,该指针指向含10个元素的一维数组(数组 ...
- 数组名与指向数组的指针之间的联系与区别【数据结构】
我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针结构,指针指向 ...
- c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针
文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...
- C语言数组指针(指向数组的指针)详解
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
最新文章
- IDEA出现import org.junit.Test飘红解决方案
- 注意力机制~Attention Mechanism
- MySQL—事务隔离级别
- java 搜索文件 pdf_Java查找并高亮PDF文本过程解析
- jupyter notebook界面颜色jt_更改jupyter notebook主题颜色——步骤详解(Windows系统)...
- java 优先队列从小到大,优先队列(Java)
- Swoole 实现简单的路由
- 敏捷武士:看敏捷高手交付卓越软件pdf
- Web Service 性能测试工具比较
- suse11安装python_suse linux 安装python Eric4
- php 按照laravel5.5,Laravel5.5 综合使用
- php中的递归算法,PHP递归算法(四)
- UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 723269-723270: illegal multibyte s
- HtmlUnitDriver 网页内容动态抓取
- Mybatis中是否需要依赖配置文件的名称要和mapper接口的名称一致 params错误
- SQL 错误: ORA-12910
- 计算机网络体系结构——各层的功能
- 数据治理之IT系统存量信息梳理
- ubuntu死机咋办_ubuntu16.04经常死机 ubuntu电脑经常死机如何解决
- uni-app 布局遇到的问题
热门文章
- mysql查询上班打卡sql怎么写_sql查询一段时期里每一天所有员工的打卡记录
- Synaptic Ubuntu软件管理工具
- 【转载】按键精灵对安卓APP进行自动化界面点击测试
- java olap oracle_【案例】Oracle数据库升级OLAP组件异常 删除OLAP组件
- 计算机专业要用多大显卡,吃鸡需要什么级别的显卡?或许跟你想的不太一样!...
- 当在线纠纷解决遇到区块链:去中心化司法的诞生
- Java的String类中提到的代码点,代码单元到底是什么?
- 求华摄氏度100‘F对应下的摄氏温度
- Certificate Transparency
- JAVA unusual问题收集