C语言——数组指针篇
说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
来源:
C语言中文网、《C语言核心技术》、《C和指针》
文章目录
- 概念
- 数组
- 数组指针(Array Pointer)
- 两种方案访问数组元素:
- 关于数组指针的谜题
概念
了解数组指针之前,先来复习一下数组的概念。
数组
已经定义一个变量,就会在内存中分配对应数据类型大小的空间,若需要存储两个那么就需要定义两个变量,若n个需要定义n个变量,每次定义变量都需要取变量名。这就显得很繁琐,于是乎数组就孕育而生了(瞎扯的),简单来说,数组(Array) 就是一组相同数据类型的集合,而里面每个数据都叫做数组元素(Element),数组元素的个数就是数据长度(Length),每个元素都有一个序号(下标(Index)),注意:下标是从0开始的而不是1开始。
一维数组定义形式:
dataType arrayName[index];
dataType:数组类型
arrayName:数组名称
index:下标(从0开始)
注意事项:
①数组中每个元素的数据类型必须相同。
②数组长度最好是整数或常量表达式
③访问数组元素,下标的取值范围:0 <=i ndex < length
④数组内存是连续的(这是和定义多个变量最大的区别),意味着可用指针进行操作。
⑤一维数组初始化方式有多种:
1)部分元素赋值:int a[10]={1,2,3,4,5};
,a[0]~a[4]赋初值,后面5个初始化为0.
2)全部元素赋值:int a[]={1,2,3,4,5};
,可不给数组长度,会自动给值。
3)只可给元素逐个赋值,不可整体赋值。int a[5]={1,1,1,1,1};
不可:int a[5]=1
⑥数组名可认为是一个指针,指向数组的第0个元素。
二维数组定义形式:
dataType arrayName[length1][length2];
dataType:数组类型
arrayName:数组名称
length1:一维下标长度(从0开始,行数)
length2:二维下标长度(从0开始,列数)
注意事项:
①概念上的二维,内存中是连续存放的。
②在C语言中,二维数组是按行排列的,放完一行之后再放入第二行;
③二维数初始化:
1)按行分段赋值:int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
2)按行连续赋值:int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
3)可以只对部分元素赋值,未赋值的元素自动取“零”值.int a[3][3] = {{1}, {2}, {3}};
,
4)如果对全部元素赋值,那么第一维的长度可以不给出.int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
④二维数组可以看作是由一维数组嵌套而成的;如果一个数组的每个元素又是一个数组,那么它就是二维数组。如,二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]。
#include<stdio.h>
int main(){int arr[] = {1,2,3,4,5,6,7,8,9,0}; /定义数组int len = sizeof(arr)/sizeof(arr[0]); /计算数组长度:sizeof(arr)计算数组全长,sizeof(arr[0])计算一个元素长度int i;int *p = arr; /让 p 指向数组中的第二个元素: int *p = &arr[2]; 也可以写作 int *p = arr + 2;printf("arr adress = %p\n",arr); /arr 本身就是一个指针,可直接赋值给指针变量 p。/arr 是数组第 0 个元素的地址,所以int *p = arr;也可以写作int *p = &arr[0];。/即:arr、p、&arr[0] 这三种写法等价的,都指向数组第 0 个元素或指向数组的开头for(i = 0; i < len;i++){printf("arr[%d] = %d\n",i,arr[i]); / *(arr+i)等价于arr[i]等价于*(p+i)printf("arr[%d] address = %p\n",i,&arr[i]);}
/可修改为printf("arr[%d] = %d\n", *p++ );*p++ 应该理解为 *(p++),每次循环都会改变 p 的值(p++ 使得 p 自身的值增加),以使 p 指向下一个数组元素。
/该语句不能写为 *arr++,因为 arr 是常量,而 arr++ 会改变它的值,这显然是错误的return 0;
}实验结果:
arr adress = 0x7fff1e60c210
arr[0] = 1
arr[0] address = 0x7fff1e60c210
arr[1] = 2
arr[1] address = 0x7fff1e60c214
arr[2] = 3
arr[2] address = 0x7fff1e60c218
。。。略
数组指针(Array Pointer)
数组指针:一个指针指向了数组。
数组指针指向的是:数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关
* (arr+i)这个表达式,arr 是数组名,指向数组的第 0 个元素,表示数组首地址, arr+i 指向数组的第 i 个元素,*(arr+i) 表示取第 i 个元素的数据,它等价于 arr[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 个元素,或者说指向数组的开头
两种方案访问数组元素:
1) 使用下标
也就是采用 arr[i] 的形式访问数组元素。如果 p 是指向数组 arr 的指针,那么也可以使用 p[i] 来访问数组元素,它等价于 arr[i]。
2) 使用指针
也就是使用 *(p+i) 的形式访问数组元素。另外数组名本身也是指针,也可以使用 *(arr+i) 来访问数组元素,它等价于 *(p+i)。
关于数组指针的谜题
提问:假设 p 是指向数组 arr 中第 n 位元素的指针,那么 p++、++p、(*p)++ 分别是什么意思呢?即:int *p=NULL; int arr[]; p=&arr[n];
回答:
*p++
等价于 *(p++)
,表示先取得第 n 个元素的值,再将 p 指向下一个元素。
*++p
等价于 *(++p)
,会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。
(*p)++
就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。
C语言——数组指针篇相关推荐
- C语言重点——指针篇(一篇让你完全搞懂指针)
C语言重点--指针篇(一篇让你完全搞懂指针) 一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和 ...
- C语言 数组指针 - C语言零基础入门教程
目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 1.数组 ...
- 深入浅出C语言:(三)C 语言数组指针(指向数组的指针)
目录 一.C 语言数组指针(指向数组的指针) 二.C 语言字符串指针(指向字符串的指针) 三.C 语言指针数组(数组每个元素都是指针) 四.二维数组指针(指向二维数组的指针) 五.指针数组和二维数组指 ...
- c语言 数组指针,C语言数组名及指向数组指针的小结
相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址. 现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地 ...
- c语言 数组指针传递给函数_嵌入式开发-C语言-指针与数组
1.指针与数组-掌握 在C语言中数组的指针:是指数组在内存中的起始地址,数组元素的地址:是指数组元素在内存中的起始地址一维数组的数组名为一维数组的指针(起始地址)例:double x[8];因些,x为 ...
- C语言数组指针(指向数组的指针)详解
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
- c语言指针引用数组元素,c语言——数组指针和通过指针引用数组元素的方法总结...
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? int (* p)[10]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 1 拓展:有指针类型元素的数组称为指针数组. ...
- *(p+i) ,C语言数组指针_C语言中文网
一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址. 字节是内存中的最小可操作单位,我们 ...
- C语言数组指针(指向数组的指针)
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
最新文章
- 天翼云从业认证(3.6)了解天翼云大数据SaaS服务
- 数据结构学习官方代码
- mysql使用主从复制迁移,[MySQL进阶之路][No.0003] 主从复制(Replication)在运维中的运用...
- 基于 Redis 实现 CAS 操作
- 问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。
- FreeSql (二)自动迁移实体
- 使用IAR在线调试功能显示数据变化曲线
- SQLite集成与用法
- .Net之美读书笔记15
- 微信小程序云开发教程-JavaScript入门(2)-变量定义
- gcc中使用rpath指定优先搜索路径
- js基础-5-数据类型,作用域,优先级
- SecureCRT下载和破解
- BMFont制作字体图集
- de4dot 脱壳工具
- 看了去年这些最热的木马、病毒和电信诈骗,感觉今年不会被骗了
- t-SNE算法解析与简单代码实现
- 3 整型变量,实型数据(主要是实型变量)2021-01-25
- HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS+JavaScript 景点静态网页设计 学生DW静态网页设计
- emoji表情的处理和保存
热门文章
- 数论概论读书笔记 37.无理数与超越数
- 数据结构与算法(基于<algorithm>)
- failed to connect to ‘192.168.*.*:5555‘: Connection refused
- 中国计算机科学家的艰苦奋斗,中科大校友结束中国无“芯”史摘得北京科技最高奖...
- 系统重装优盘PE启动工具-优启通PE使用体会分享
- 可视化搭建平台的地图组件和日历组件方案选型
- C语言的关键字和标识符
- 项目管理(PMP)项目沟通管理
- 三次样条曲线CubicSpline
- 【龙印】FDM 3d打印机常见打印质量问题和解决办法