指针变量与数组的关系及什么是指针数组:

  • 一维数组:

数组原本就是以指针的格式使用的,数组名a相当于char * const a。但这里需要注意的是数组名表示的是一个数组的首地址,是一个地址常量,不能给地址常量赋值,但能改变该地址所指向的内容,比如之前a首地址存放的内容为1,可以使用*a=2改变该地址单元里的内容。
在输出数组元素的值时一般以a[0]形式输出,该a[0]形式相当于**a、*(a+0)
char a[1],*p;
引用一维数组a的第i个元素,有下标法和指针法。假设指针变量p指向数组的首元素(p=a),则有四种数组元素的表示方法:
a[i] ↔ p[i] ↔ *(p(是变量)+i) ↔ *(a(是常量)+i)
a相当于c语言的宏替换#define a 地址常量。p是一个变量,是要把改变量所存放的地址常量取出来参加运算。

这里需要注意的是,指针变量和数组在访问数组中的元素时,一定条件下其使用方法具有相同的形式,因为指针变量和数组名都是地址量。但指针变量和数组的指针(或叫数组名)在本质上是不同的,数组在内存中的位置在程序运行过程中是无法动态改变的。因此,数组名是地址常量,指针是地址变量。数组名可以在运算中作为指针参与,但不允许被赋值。

  • 二维数组:

二维数组实际上是以一维数组的方式连续存放的,比如这里定义一个二维数组int c[2][2],可以把这二维数组当作是由两个一维数组组成的,然后我们在以一维数组的访问方式去访问数组元素,第一行的一维数组名为c[0],第二行的一维数组名为c[1]。这两个一维数组名与首数组名c类型一样,都是地址常量。首数组名c等于第一行一维数组名c[0], c+1就等于第二行的一维数组名c[1]。所以去访问二维数组也和一维数组一样。
这里定义一个指针int p=c[0]。
第一行:c[0][i] ↔ *(p+i) ↔ *(c[0]+i) ↔ *(*(c+0)+i) ↔ *(&c[0][0]+i)
第二行:c[1][i] ↔ *(c[1]+i) ↔ *(*(c+1)+i) ↔ *(&c[1][0]+i)
这里需要注意的是,
(c+1)的结果是第二行的首地址,不是该地址所指向的内容。也就是*(c+1)等价于c[1](前提是二维数组。在一维数组中*(a+1)返回的是地址所指向的内容,不是地址),这里实际也说明了数组本身就是以指针的形式去处理的。

指针数组:顾名思义,就是由同种类型的指针变量构成的数组。
比如有如下定义:
char p[2];
这里需要注意的是,由于“[ ]”的优先级高于“
”,所以,数组名p先于“[ ]”结合,构成一个数组形式,然后该数组在与“*”结合,构成指针数组形式。

这里说下指针数组名与非指针数组名的区别(一维数组举例):
非指针一维数组名的是地址常量,是一级指针形式。而指针的一维数组名也是一个地址常量,但该地址是二级指针形式。
之前我们知道了以为数组值可以用下标法引用,但也可以用指针法引用,比如:
a[1]等价于*(a+1)
所以引用指针数组元素可以使用:((p+i)),也就是**(p+i),或者*p[i]来引用。
指针数组首地址是二级指针地址常量,所以可以定义一个二级指针变量来指向该二级指针地址常量,即 char p1=p;或者也可以用p1=&p[0]来指向,这两种形式是一样的。

下面讲下如何使用指针数组来遍历非指针二维数组中的元素:
这里先定义一个字符二维数组:char c[2][2]={1,2,3,4};
然后再定义一个指针数组,将指针数组指向该字符二维数组:char *p[2]={ c[0] , c[1] };

那么,如何访问字符二维数组的第一行元素呢?
我们知道p[0]保存的是c[0]地址常量或者说保存的是&c[0][0],所以p[0]指向第一行第一列的内容,即值1。那么如何指向第一行第二列的值呢,很简单下,先用p[0]取出第一行第一列的地址,然后将地址加一,即p[0]+i,在将该地址的值取出,即(p[0]+i),然后我们知道p[0]也可以表示成*(p+0),所以又可以表示成*((p+0)+i),同理,第二行数组元素的值可以表示成(*(p+1)+i)。

指针变量与数组的关系及什么是指针数组相关推荐

  1. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  2. c语言下标法改为指针变量法,C语言教材第七章指针实验.doc

    C语言教材第七章指针实验.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  3. C补习--------->第六天,二级指针、指针和数组的关系、选择排序

    二级指针: 二维数组?--->数组的数组 二级指针?--->指针的指针 概念:二级指针存储的是一级指针的地址 (定义意味着有空间   有空间就会有地址)      格式:        定 ...

  4. (转)字符型指针变量与字符数组的区别

    (1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分 ...

  5. c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...

  6. C程序设计基础之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示.    在前面曾经介 ...

  7. 指针系统学习5-对使用字符指针变量和字符数组的讨论

    虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈-- 主要概括起来有以下几点: 1. 字符数组由若干个元素组成,每个元素中  放一个字符,而字符指针变量中 ...

  8. C语言中数组变量和指针变量

    指针变量为什么需要类型? 数组变量和指针变量在使用sizeof时不同,sizeof(数组变量)是数组长度,sizeof(指针变量)是存储int的字节长度4或者8(64bit). 数组变量在参数传递中, ...

  9. 字符指针变量和字符数组的对比

    使用字符数组和指针变量都能实现字符串的存储和运算,但它们两者之间是有区别的,不应混为一谈,主要有一下几点: (1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串中 ...

  10. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)

    C语言:指针 1. 指针:保存地址的变量 *p (pointer) ,这种变量的值是内存的地址.   取地址符& 只用于获取变量(有地址的东西)的地址:scanf函数-取地址符   地址的大小 ...

最新文章

  1. SQL 时间类型转字符串格式列表
  2. linux containerd 容器 简介
  3. android开发菜单,Android学习指南之十六:Android菜单详解
  4. python ev3图形化编程软件下载_mPython(图形化编程软件)
  5. [SpringBoot2]原生组件注入_原生注解与Spring方式注入
  6. Luogu P1115 最大子段和(dp 贪心)
  7. 如何在其他程序的窗口上创建按钮并使之能响应
  8. MySQL Spatial Analysis Functions(空间计算方法)
  9. 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流
  10. 由电梯紧急按钮,谈用户体验
  11. windows电脑截截屏截图的方法
  12. Docker基础(centos安装、阿里云镜像加速器配置、常用命令、数据卷、DockerFile、镜像推送阿里云等)
  13. [App] FTP 命令全集
  14. (费用流)洛谷P2469 [SDOI2010]星际竞速
  15. 【全局路径规划】A*算法 A* Search Algorithm
  16. win10+ubuntu双系统之三步彻底删除ubuntu系统
  17. Ubuntu中Cairo Dock内天气预报地理位置的设置
  18. 3. LaTeX图片的排版、引用与格式
  19. 西邮Linux兴趣小组2019-2021年纳新面试题解析
  20. 电磁兼容入门篇之”分贝“,你理解的不过是冰山一角

热门文章

  1. 更改计算机的桌面图标,电脑如何更改桌面图标 更改桌面图标方法
  2. 聚类算法Kmens和密度峰值聚类
  3. 计算机基础——Excel 2010
  4. 关于django后台界面的美化
  5. Windows Server2008下安装JDK
  6. 写论文需要使用一个Github上的模型取数据,具体要求在代码里
  7. cat <<EOF语句的意思
  8. 美式英语 [t] 的发音
  9. python代码使用dns进行调试_python脚本实现分析dns日志并对受访域名排行
  10. 个人总结 onSaveInstanceState方法会在什么时候被执行