本博文内容参考:《C 和 指针》

本博文解决两个问题,一是如何访问二维数组的行,以及元素;二是如何定义指向数组的指针以及如何赋值等。

很简单,快速记录!


先给出一个案例,判断下面这两个声明以及赋值合法吗?

int vector[10], *vp = vector;

int matrix[3][10], *mp = matrix;

第一个声明是合法的。它为一个整型数组分配内存,并把vp声明为一个指向整型的指针,并把它初始化为指向vector数组的第一个元素。vector 和 vp具有相同的类型,都是指向整型的指针。也有区别,vp是指针变量,而vector是指针常量。

第二条声明语句是非法的,这里的非法是指对指针mp的赋值是不正确的,声明本身是没有问题的。

它正确地创建了一个matrix数组,并把mp声明为一个指向整型的指针。但是mp的初始化是不正确的,因为matrix并不是一个指向整型的指针常量,而是一个指向整型数组的指针。(它指向matrix数组的第一个元素,而这个元素又包含10个元素,更确切地说,也就是matrix指向该数组的第一行,也就相当于一个一维数组。)


我们怎么样声明一个指向整型数组的指针呢?

int (*p) [10];

这个声明作为一个重新捡起c语言的人来说应该是不难的,但是对于小白来说,肯定还是会吓出一身冷汗!

声明也不是乱声明的,肯定有它的道理,我们来分析下:

下标引用【】的优先级要高于间接访问*,但是括号的优先级最高,所以首先执行的还是间接访问。所以p还是一个指针,这个指针指向的是什么呢?

接下来执行的是下标引用,所以p指向某种类型的数组。这个声明表达式中并没有更多的操作符,所以数组的每个元素都是整数。

声明并没有告诉你p是什么?但推断它的类型并不困难,当我们对它执行间接访问操作时,我们得到的是数组,对该数组进行下标引用操作得到的是一个整型值。所以说,这个指针是指向整型数组的指针。

在生声明中加上初始化是这个样子:

int (*p)[10] = matrix;

它使p指向matrix的第一行。

p是一个指向拥有10个整型元素的数组的指针。当你把p与一个整数相加时,该整数值首先根据10个整型值的长度进行调整,然后执行加法。所以我们可以使用这个指针一行一行地在matrix中移动。

如果你需要一个指针逐个访问整型元素而不是逐行在数组中移动,你该怎么办?

下面两个声明都创建了一个简单的整型指针,并以两种不同的方式进行初始化,指向matrix的第一个整型元素。

int *pi = &matrix[0][0];

int *pi = matrix[0];

增加这个指针的值使它指向下一个整型元素。

【 C 】指向数组的指针(数组指针)(行指针)相关推荐

  1. C++二维数组名与数组指针的思考

    二维数组名和数组指针可以当做一个东西用,但两者之间的含义是不同的. 二维数组名是一个指向数组中所有元素的指针,而数组指针是一个行指针.体现在sizeof()上的不同. #include <ios ...

  2. printf 指针地址_数组指针和指针数组

    首先,理解一下数组指针和指针数组这两个名词: 数组的指针:是一个指针,什么样的指针呢?指向数组的指针. 指针的数组:是一个数组,什么样的数组呢?装着指针的数组. 然后,需要明确一个优先级顺序:()&g ...

  3. [c/c++]指针数组 pk 数组指针

    首先强调 指针数组归根结底是个数组:数组指针归根结底是个指针. 数组指针 以int (*int)[10]为例 ()的优先级大于[],因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针 ...

  4. C/C++ 指针数组、二维数组

    一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 里面的括号是 {} , 而不是() 2> 将二维数组当做一维数 ...

  5. 指针数组,数组指针与二维数组剖析

    int *p[3]与int (*p)[3]的区别 *p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一 ...

  6. 指针数组和数组指针(非常易懂)

    指针数组与数组指针 目录: 1.指针与一维数组 2.指针与二维数组 3.指针数组与数组指针 1.指针与一维数组 当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首 ...

  7. (CED)列指针与行指针的联系与区别

    一.列指针(竖为列) 1.列指针相关定义 列指针:被称为是指针变量指向二维数组的某个元素 一般使用时会有如下定义: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; ...

  8. c语言列指针的形式,C语言:行指针和列指针

    本文主要介绍C语言二维数组中的行指针及列指针,目的是为了搞清二维数组或更高维数组在作为函数参数进行传递时,考虑到代码的可复用性及软件最小权限原则,如何声明该形式参数.学习笔记,仅供参考,如有错误,敬请 ...

  9. 行指针与列指针的联系和区别

    两个重要概念:行指针和列指针. 行指针:指的是一整行,不指向具体元素. 列指针:指的是一行中某个具体元素. 可以将列指针理解为行指针的具体元素,行指针理解为列指针的地址. 那么两个概念之间的具体转换是 ...

最新文章

  1. 黑科技抗疫,Python开发者大集结!
  2. 基于python物流管理系统毕业设计-Python程序设计实验报告一 :熟悉IDLE和在线编程平台...
  3. 中国乒乓球,牛!!!!
  4. sql 12天内的数据_想要在12周内成为数据科学家吗?
  5. 解密GaussDB(for Influx)时序洞察
  6. 进程占用过高cpu的排查
  7. vue 父组件给子组件传值
  8. 计算机导论电子版_程序员进阶系列:拿下中科大的计算机课程全靠它了!
  9. 一个简单的问题,为什么我要搞得复杂绕一大圈
  10. 基于SSM的医院药品库存管理系统
  11. VS2012 正式版BUG太多
  12. C#窗体控件—textbox
  13. Maltlab代码:四种基本的信道编码格式
  14. 计算机房电磁辐射防护,环境电磁辐射监测仪器要求和标准监测方法
  15. openCv 图像顺时针 逆时针旋转
  16. 十一、BDB ManyToMany
  17. Hibernate的三种检索策略
  18. MySql连接不上问题
  19. Linux cat命令的使用
  20. Python中双冒号的作用

热门文章

  1. c# ftp类[转]
  2. ZOUNDRY TEST
  3. php call_user_func_array 性能,php-call_user_func_array是否太慢?
  4. android 线程信号量,iOS开发 多线程的高级应用-信号量semaphore
  5. linux查看CPU利用率与负载,Linux CPU负载利用率统计
  6. mysql 字符串有有乱码 转码_第09期:有关 MySQL 字符集的乱码问题
  7. 监控操作系统和服务器,监控操作系统和服务器
  8. 第十六届全国大学生智能车竞赛华南赛区竞赛事宜的通知
  9. 多股Litz线制作无线耦合线圈测试
  10. 第十六届全国大学生智能汽车竞赛设想