C语言指针数组案例详解

 更新时间:2021年07月01日 16:11:25   作者:chenguijia  
这篇文章主要介绍了C语言指针数组案例详解,本文通过案例详细的解释了指针与数组的初始化还有关系与应用,需要的朋友可以参考下这篇文章

指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。

1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如: char str[20], *ptr;
ptr=str;
ptr 被置为数组 str 的第一个元素的地址,因为数组名就是该数组的首地址, 也是数组第一个元素的地址。此时可以认为指针 ptr 就是数组 str(反之不成立), 这样原来对数组的处理都可以用指针来实现。如对数组元素的访问,既可以用下 标变量访问,也可以用指针访问。

2.指向数组元素的指针 若有如下定义:
int a[10], *pa;
pa=a;
则 p=&a[0]是将数组第 1 个元素的地址赋给了指针变量 p。
实际上,C 语言中数组名就是数组的首地址,所以第一个元素的地址可以用 两种方法获得:p=&a[0]或 p=a。
这两种方法在形式上相像,其区别在于:pa 是指针变量,a 是数组名。值得 注意的是:pa 是一个可以变化的指针变量,而 a 是一个常数。因为数组一经被 说明,数组的地址也就是固定的,因此 a 是不能变化的,不允许使用 a++、+
+a 或语句 a+=10,而 pa++、++pa、pa+=10 则是正确的。由此可见,此时 指针与数组融为一体。

3.指针与一维数组 理解指针与一维数组的关系,首先要了解在编译系统中,一维数组的存储组
织形式和对数组元素的访问方法。 一维数组是一个线形表,它被存放在一片连续的内存单元中。C 语言对数组
的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标 变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的 内容进行访问。通常把数据类型所占单元的字节个数称为扩大因子。
实际上编译系统将数组元素的形式 a[ i]转换成*(a+i),然后才进行运算。 对于一般数组元素的形式:<数组名>[<下标表达式>],编译程序将其转换成:* (<数组名>+<下标表达式>),其中下标表达式为:下标表达式*扩大因子。整个 式子计算结果是一个内存地址,最后的结果为:*<地址>=<地址所对应单元的地 址的内容>。由此可见,C 语言对数组的处理,实际上是转换成指针地址的运算。
数组与指针暗中结合在一起。因此,任何能由下标完成的操作,都可以用指 针来实现,一个不带下标的数组名就是一个指向该数组的指针。

4.指针与多维数组 用指针变量可以指向一维数组,也可以指向多维数组。但在概念上和使用上,
多维数组的指针比一维数组的指针要复杂一些。 例如,在一个三维数组中,引用元素 c[ i][j][k]的地址计算最终将换成:
*(*(*(c+i)+j)+k)。了解了多维数组的存储形式和访问多维数组元素的内 部转换公式后,再看当一个指针变量指向多维数组及其元素的情况。
1 指向数组元素的指针变量

若有如下说明: int a[3][4]; int *p;
p=a;
p 是指向整型变量的指针;p=a 使 p 指向整型二维数组 a 的首地址。
*(*(p+1)+2)表示取 a[1][2]的内容;*p 表示取 a[0][1]的内容,因为 p 是指向整型变量的指针;p++表示 p 的内容加 1,即 p 中存放的地址增加一个 整型量的字节数 2,从而使 p 指向下一个整型量 a[0][1]。
2 指向由 j 个整数组成的一维数组的指针变量
当指针变量 p 不是指向整型变量,而是指向一个包含 j 个元素的一维数组。 如果 p=a[0],则 p++不是指向 a[0][1],而是指向 a[1]。这时 p 的增值以一维 数组的长度为单位。
5.指针与字符数组
C 语言中许多字符串操作都是由指向字符数组的指针及指针的运算来实现 的。因为对于字符串来说,一般都是严格的顺序存取方式,使用指针可以打破这 种存取方式,更为灵活地处理字符串。
另外由于字符串以′\0′作为结束符,而′\0′的 ASCII 码是 0,它正好是 C 语言的逻辑假值,所以可以直接用它作为判断字符串结束的条件,而不需要用 字符串的长度来判断。C 语言中类似的字符串处理函数都是用指针来完成,使程 序运行速度更快、效率更高,而且更易于理解。

到此这篇关于C语言指针数组案例详解的文章就介绍到这了,更多相关C语言指针数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现图片防盗链功能

    SpringBoot实现图片防盗链功能

    出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地址后被下载,或者,不想浏览器直接访问图片链接,所以本文将给大家介绍SpringBoot实现图片防盗链功能,需要的朋友可以参考下
    2024-04-04
  • spring关于组件的注入及获取流程场景分析

    spring关于组件的注入及获取流程场景分析

    这篇文章主要介绍了spring关于组件的注入及获取流程场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • 分享Java8中通过Stream对列表进行去重的实现

    分享Java8中通过Stream对列表进行去重的实现

    本文主要介绍了分享Java8中通过Stream对列表进行去重的实现,包括两种方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • HttpClient 请求 URL字符集转码问题

    HttpClient 请求 URL字符集转码问题

    这篇文章主要介绍了HttpClient 请求 URL字符集转码问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java中Synchronized的用法解析

    Java中Synchronized的用法解析

    synchronized是Java中的关键字,是一种同步锁,本文给大家详细介绍Java Synchronized 用法大全,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • Java中Comparable接口和Comparator接口的使用比较

    Java中Comparable接口和Comparator接口的使用比较

    Java中提供了两种对集合或数组中元素进行排序的方法,一种是实现Comparable接口,另一种是实现Comparator接口,下面这篇文章主要给大家介绍了关于Java中Comparable接口和Comparator接口使用的相关资料,需要的朋友可以参考下
    2024-06-06
  • 详解PipedInputStream和PipedOutputStream_动力节点Java学院整理

    详解PipedInputStream和PipedOutputStream_动力节点Java学院整理

    这篇文章主要为大家详细介绍了管道PipedInputStream和PipedOutputStream,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JAVAEE Filter 过滤器设置是否缓存实例详解

    JAVAEE Filter 过滤器设置是否缓存实例详解

    网页中,每次的客户端访问服务器,有部分不用重复请求的,这样可以减轻服务器的工作量。那么如何设置客户端是否都缓存呢?接下来通过本文给大家介绍JAVAEE Filter 过滤器设置是否缓存的实例,感兴趣的朋友一起学习吧
    2016-05-05
  • SpringMVC 中HttpMessageConverter简介和Http请求415 的问题

    SpringMVC 中HttpMessageConverter简介和Http请求415 的问题

    本文介绍且记录如何解决在SpringMVC 中遇到415 Unsupported Media Type 的问题,并且顺便介绍Spring MVC的HTTP请求信息转换器HttpMessageConverter
    2016-07-07
  • SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类)

    这篇文章主要介绍了SpringBoot之ApplicationRunner解析(spring容器启动完成执行的类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论