• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言 数组指针详解及示例代码

C语言 数组指针详解及示例代码

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言数组与指针详解,c语言指针数组,c语言二维数组指针,c语言函数指针数组,c语言中数组指针等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示:

定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第 0 个元素。在C语言中,我们将第 0 个元素的地址称为数组的首地址。以上面的数组为例,下图是 arr 的指向:

下面的例子演示了如何以指针的方式遍历数组元素:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int len = sizeof(arr) / sizeof(int); //求数组长度
 int i;
 for(i=0; i<len; i++){
  printf("%d ", *(arr+i) ); //*(arr+i)等价于arr[i]
 }
 printf("\n");
 return 0;
}
</div>

运行结果:

99  15  100  888  252

第 4 行代码用来求数组的长度,sizeof(arr) 会获得整个数组所占用的字节数,sizeof(int) 会获得一个数组元素所占用的字节数,它们相除的结果就是数组包含的元素个数,也即数组长度。

第 8 行代码中我们使用了*(arr+i)这个表达式,arr 是数组名,指向数组的第 0 个元素,表示数组首地址, arr+i 指向数组的第 i 个元素,*(arr+i) 表示取第 i 个元素的数据,它等价于 arr[i]。
arr 是int*类型的指针,每次加 1 时它自身的值会增加 sizeof(int),加 i 时自身的值会增加 sizeof(int) * i,这在《指针变量的运算》中已经进行了详细讲解。

我们也可以定义一个指向数组的指针,例如:

int arr[] = { 99, 15, 100, 888, 252 };
int *p = arr;

arr 本身就是一个指针,可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以int *p = arr;也可以写作int *p = &arr[0];。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。

如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)。

需要注意是,数组本身没有类型,数组元素才有类型,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int *。

反过来想,p 并不知道它指向的是一个数组,p 只知道它指向的是一个整数,究竟如何使用 p 取决于程序员的编码。

更改上面的代码,使用数组指针来遍历数组元素:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *(p+i) );
 }
 printf("\n");
 return 0;
}
</div>

数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。

上节我们讲到,对指针变量进行加法和减法运算时,是根据数据类型的长度来计算的。如果一个指针变量 p 指向了数组的开头,那么 p+i 就指向数组的第 i 个元素;如果 p 指向了数组的第 n 个元素,那么 p+i 就是指向第 n+i 个元素;而不管 p 指向了数组的第几个元素,p+1 总是指向下一个元素,p-1 也总是指向上一个元素。

更改上面的代码,让 p 指向数组中的第二个元素:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int *p = &arr[2]; //也可以写作 int *p = arr + 2;
 printf("%d, %d, %d, %d, %d\n", *(p-2), *(p-1), *p, *(p+1), *(p+2) );
 return 0;
}
</div>

运行结果:

99, 15, 100, 888, 252

引入数组指针后,我们就有两种方案来访问数组元素了,一种是使用下标,另外一种是使用指针。

1) 使用下标

也就是采用 arr[i] 的形式访问数组元素。如果 p 是指向数组 arr 的指针,那么也可以使用 p[i] 来访问数组元素,它等价于 arr[i]。

2) 使用指针

也就是使用 *(p+i) 的形式访问数组元素。另外数组名本身也是指针,也可以使用 *(arr+i) 来访问数组元素,它等价于 *(p+i)。

不管是数组名还是数组指针,都可以使用上面的两种方式来访问数组元素。不同的是,数组名是常量,它的值不能改变,而数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。

更改上面的代码,借助自增运算符来遍历数组元素:

#include <stdio.h>
int main(){
 int arr[] = { 99, 15, 100, 888, 252 };
 int i, *p = arr, len = sizeof(arr) / sizeof(int);
 for(i=0; i<len; i++){
  printf("%d ", *p++ );
 }
 printf("\n");
 return 0;
}
</div>

运行结果:

99  15  100  888  252

第 8 行代码中,*p++ 应该理解为 *(p++),每次循环都会改变 p 的值(p++ 使得 p 自身的值增加),以使 p 指向下一个数组元素。该语句不能写为 *arr++,因为 arr 是常量,而 arr++ 会改变它的值,这显然是错误的。

关于数组指针的谜题

假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?

*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。

*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。

(*p)++ 就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。假设 p 指向第 0  个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0  个元素的值就会变为 100。

以上就对C语言 数组指针的资料整理,后续继续补充相关知识,谢谢大家对本站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中 值传递和指针传递实例详解
  • C语言 指针与数组的详解及区别
  • 详解C语言中的函数、数组与指针
  • C语言 函数指针(指向函数的指针)详解
  • C语言 指针与二维数组详解
  • C语言 数组指针详解及示例代码
  • C 语言指针概念的详解
  • 详解C语言编程中的函数指针以及函数回调
  • 详解C语言结构体中的函数指针
  • 详解C语言中的常量指针和指针常量

相关文章

  • 2017-05-28二维指针动态分配内存连续问题深入分析
  • 2017-05-28C++标准模板库函数sort的那些事儿
  • 2017-05-28举例理解C语言二维数组的指针指向问题
  • 2017-05-28C++使用递归方法求n阶勒让德多项式完整实例
  • 2017-05-28c++线程池实现方法
  • 2017-05-28CString,字符串,整数等相互转换方法(推荐)
  • 2017-05-28C++中用两个标准容器stack,实现一个队列的方法详解
  • 2017-05-28c++ const引用与非const引用介绍
  • 2017-05-28C++动态规划之背包问题解决方法
  • 2017-05-28C语言读取文件流的相关函数用法简介

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解C语言中accept()函数和shutdown()函数的使用
    • C++动态规划之最长公子序列实例
    • VC小技巧汇总之对话框技巧
    • C++中的对象数组详细解析
    • C/C++实现矩阵的转置(示例代码)
    • 浅析c#中WebBrowser控件的使用方法
    • C++ expected initializer before 'myfile'
    • 关于memcpy和memmove的一点重要说明
    • 下标操作符重载模拟多维数组详解
    • 最大子矩阵问题实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有