一、问题

下面这些声明合法吗?

 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++声明指向数组的指针相关推荐

  1. C指针4:数组指针(指向数组的指针)

    先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...

  2. 【 C 】指向数组的指针(数组指针)(行指针)

    本博文内容参考:<C 和 指针> 本博文解决两个问题,一是如何访问二维数组的行,以及元素:二是如何定义指向数组的指针以及如何赋值等. 很简单,快速记录! 先给出一个案例,判断下面这两个声明 ...

  3. 指向数组的指针的理解

    指向数组的指针的理解 开发工具与关键技术:Visual Studio.C++ 作者:张国军 撰写时间:2019年05月03日 数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值. ...

  4. 第五章 指向数组的指针

    讲到第五章了,数组两个字还离不开我们的左右,数组的内容也真多,另一方面也因为数组与指针的关系的确非常密切. 通常,对于int a[8][9]这个二维数组,我们可以这样定义一个指向它的指针: int ( ...

  5. 指针笔记(指针数组和指向数组的指针,数组中a和a的区别等)

    指针数组和指向数组的指针 int *p[4]和int (*p)[4]有何区别? 前者是一个指针数组,数组大小为4,每一个元素都是一个指向int的指针 后者是指向int[4]类型数组的指针 以上代码若运 ...

  6. C和指针之指针数组和指向数组的指针

    1.指针数组 定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义 int *p[10]; 2.指向数组的指针 定义一个数组指针,该指针指向含10个元素的一维数组(数组 ...

  7. 数组名与指向数组的指针之间的联系与区别【数据结构】

    我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针结构,指针指向 ...

  8. c语言指针变量的定义数组的长度,【C语言更新】指向数组的指针

    文/Edward 前面我们在讲述数组的时候曾经说过,对于数组内部元素的引用方式主要有两种,一种就是使用方括号"[]"的下标索引,另一种就是之前提到过,但是没有细致讲述的指针引用. ...

  9. C语言数组指针(指向数组的指针)详解

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...

最新文章

  1. IDEA出现import org.junit.Test飘红解决方案
  2. 注意力机制~Attention Mechanism
  3. MySQL—事务隔离级别
  4. java 搜索文件 pdf_Java查找并高亮PDF文本过程解析
  5. jupyter notebook界面颜色jt_更改jupyter notebook主题颜色——步骤详解(Windows系统)...
  6. java 优先队列从小到大,优先队列(Java)
  7. Swoole 实现简单的路由
  8. 敏捷武士:看敏捷高手交付卓越软件pdf
  9. Web Service 性能测试工具比较
  10. suse11安装python_suse linux 安装python Eric4
  11. php 按照laravel5.5,Laravel5.5 综合使用
  12. php中的递归算法,PHP递归算法(四)
  13. UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 723269-723270: illegal multibyte s
  14. HtmlUnitDriver 网页内容动态抓取
  15. Mybatis中是否需要依赖配置文件的名称要和mapper接口的名称一致 params错误
  16. SQL 错误: ORA-12910
  17. 计算机网络体系结构——各层的功能
  18. 数据治理之IT系统存量信息梳理
  19. ubuntu死机咋办_ubuntu16.04经常死机 ubuntu电脑经常死机如何解决
  20. uni-app 布局遇到的问题

热门文章

  1. mysql查询上班打卡sql怎么写_sql查询一段时期里每一天所有员工的打卡记录
  2. Synaptic Ubuntu软件管理工具
  3. 【转载】按键精灵对安卓APP进行自动化界面点击测试
  4. java olap oracle_【案例】Oracle数据库升级OLAP组件异常 删除OLAP组件
  5. 计算机专业要用多大显卡,吃鸡需要什么级别的显卡?或许跟你想的不太一样!...
  6. 当在线纠纷解决遇到区块链:去中心化司法的诞生
  7. Java的String类中提到的代码点,代码单元到底是什么?
  8. 求华摄氏度100‘F对应下的摄氏温度
  9. Certificate Transparency
  10. JAVA unusual问题收集