一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。

字节是内存中的最小可操作单位,我们通常将一个字节称为一个内存单元。

一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量)组成的。每个数组元素按其类型不同占有几个连续的内存单元。一个数组元素的首地址也是指它所占有的几个内存单元的首地址。

定义一个指向数组元素的指针变量的方法,与以前介绍的指针变量相同。例如:

int a[10];  //定义a为包含10个整型数据的数组
int *p;  //定义p为指向整型变量的指针

应当注意,因为数组为int型,所以指针变量也应为指向int型的指针变量。下面是对指针变量赋值:

p=&a[0];

把a[0]元素的地址赋给指针变量p。也就是说,p指向a数组的第0个元素。

C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此,下面两个语句等价:

p=&a[0];
p=a;

在定义指针变量时可以赋给初值:

int *p=&a[0];

它等效于:

int *p;
p=&a[0];

当然定义时也可以写成:

int *p=a;

从图中我们可以看出有以下关系:p、a、&a[0]均指向同一单元,它们是数组a的首地址,也是第 0 个元素a[0]的首地址。应该说明的是p是变量,而a、&a[0]都是常量,在编程时应予以注意。

通过指针引用数组

C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。

引入指针变量后,就可以用两种方法来访问数组元素了。

如果p的初值为&a[0],则:

  • p+i 和 a+i 就是 a[i] 的地址,或者说它们指向a数组的第 i 个元素。
  • *(p+i) 或 *(a+i) 就是 p+i 或 a+i 所指向的数组元素(的内容),即a[i]。例如,*(p+5) 或*(a+5) 就是 a[5]。
  • 指向数组的指针变量也可以带下标,如 p[i] 与 *(p+i) 等价。

根据以上叙述,引用一个数组元素可以用:

  • 下标法:即用 a[i] 形式访问数组元素,在前面介绍数组时都是采用这种方法。
  • 指针法:即采用 *(a+i) 或 *(p+i) 形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组的指针变量,它们的值相同。

【示例①】输出数组中的全部元素(下标法)。

复制纯文本新窗口

  1. #include <stdio.h>
  2. int main(){
  3. int a[10], i;
  4. for(i=0; i<10; i++)
  5. a[i]=i;
  6. for(i=0;i<10;i++)
  7. printf("a[%d]=%d\n", i, a[i]);
  8. return 0;
  9. }

【示例②】输出数组中的全部元素(通过数组名计算元素的地址,找出元素的值)。

  1. #include <stdio.h>
  2. int main(){
  3. int a[10], i;
  4. for(i=0; i<10; i++)
  5. *(a+i) = i;
  6. for(i=0; i<10; i++)
  7. printf("a[%d]=%d\n", i, *(a+i));
  8. return 0;
  9. }

【示例③】输出数组中的全部元素(用指针变量指向元素)。

  1. #include <stdio.h>
  2. int main(){
  3. int a[10], i, *p;
  4. p = a;
  5. for(i=0; i<10; i++)
  6. *(p+i) = i;
  7. for(i=0; i<10; i++)
  8. printf("a[%d]=%d\n", i, *(p+i));
  9. return 0;
  10. }

拓展阅读

C语言数组灵活多变的访问形式

几个注意的问题:
1) 指针变量可以实现本身的值的改变。如p++是合法的;而a++是错误的。因为a是数组名,它是数组的首地址,是常量。

2) 要注意指针变量的当前值。请找出下面程序的错误:

  1. #include <stdio.h>
  2. int main(){
  3. int *p, i, a[10];
  4. p=a;
  5. for(i=0; i<10; i++)
  6. *p++=i;
  7. for(i=0; i<10; i++)
  8. printf("a[%d]=%d\n", i, *p++);
  9. return 0;
  10. }

改正:

  1. #include <stdio.h>
  2. int main(){
  3. int *p, i, a[10];
  4. p=a;
  5. for(i=0; i<10; i++)
  6. *p++=i;
  7. p=a;
  8. for(i=0; i<10; i++)
  9. printf("a[%d]=%d\n", i, *p++);
  10. return 0;
  11. }

3) 从上例可以看出,虽然定义数组时指定它包含10个元素,但指针变量可以指到数组以后的内存单元,系统并不认为非法。

4) *p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。

5) *(p++)与*(++p)作用不同。若p的初值为a,则*(p++)等价a[0],*(++p)等价a[1]。

6) (*p)++表示p所指向的元素值加1。

7) 如果p当前指向a数组中的第i个元素,则:

  • *(p--)相当于a[i--];
  • *(++p)相当于a[++i];
  • *(--p)相当于a[--i]。

*(p+i) ,C语言数组指针_C语言中文网相关推荐

  1. C语言 数组指针 - C语言零基础入门教程

    目录 一.简介 1.数组 2.指针 3.指针和数组区别 二.数组指针 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.简介 1.数组 ...

  2. c语言 数组指针,C语言数组名及指向数组指针的小结

    相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址. 现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地 ...

  3. 出参传递数组指针_C语言指针重难点详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  4. C语言 函数指针 - C语言零基础入门教程

    目录 一.函数指针简介 1.常规函数声明 2.函数指针声明 二.函数指针实战 三.猜你喜欢 零基础 Python 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.函数指 ...

  5. C语言 野指针 - C语言零基础入门教程

    目录 一.简介 二.野指针产生的原因 1.指针变量未初始化 2.指针释放后之后未置空 三.避免野指针产生 1.初始化时置 NULL 2.释放时置 NULL 四.猜你喜欢 零基础 C/C++ 学习路线推 ...

  6. C语言 void 指针 - C语言零基础入门教程

    目录 一.指针简介 二.空指针 NULL 三.void 指针 四.重点总结 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.指针简介 ...

  7. 深入浅出C语言:(三)C 语言数组指针(指向数组的指针)

    目录 一.C 语言数组指针(指向数组的指针) 二.C 语言字符串指针(指向字符串的指针) 三.C 语言指针数组(数组每个元素都是指针) 四.二维数组指针(指向二维数组的指针) 五.指针数组和二维数组指 ...

  8. C语言 数组下标越界 - C语言零基础入门教程

    目录 一.数组下标越界简介 1.什么是数组访问越界? 2.访问越界会出现什么结果? 二.数组下标越界案例 三.防止数组下标越界方法 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习 ...

  9. c语言 数组指针传递给函数_嵌入式开发-C语言-指针与数组

    1.指针与数组-掌握 在C语言中数组的指针:是指数组在内存中的起始地址,数组元素的地址:是指数组元素在内存中的起始地址一维数组的数组名为一维数组的指针(起始地址)例:double x[8];因些,x为 ...

最新文章

  1. 【TAMU】最新《时间序列分析》课程笔记,512页pdf
  2. 饭卡(HDOJ2546)
  3. 进度条(python 实现)
  4. 曝光原理_简单摄影之一 曝光原理
  5. vscode + plantuml实现uml的编写
  6. P6834-[Cnoi2020]梦原【数学期望,树状数组】
  7. PyCharm平台下初学Django框架
  8. 26期20180718 rsync
  9. vb.net 教程 11-1 打印组件 5 PrintPreviewDialog
  10. 字节跳动常见算法面试题top50整理
  11. Redis key-value乱码问题
  12. css重复,CSS小课堂之可重复渐变
  13. egret的WebView实现(基于egret2.5)
  14. 微信公众号文章如何设置关键词自动回复链接
  15. css基本语法选择器
  16. 网络爬虫之东方财富网股票板块
  17. [转]倾斜摄影单体化实现方案
  18. 2016中国高校计算机大赛——大数据挑战赛极客奖:COM团队
  19. 部分透明的遮罩层处理
  20. Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程

热门文章

  1. 读王立群《千古一帝秦始皇》有感
  2. php 空指针_空指针Base on windows Writeup
  3. html+css基础仏学习教程之HTML 中播放声音或者视频的方法有很多种。
  4. hackthebox-tabby (LFI tomcat9 渗透 lxd 提权)
  5. 在图片上动态的写文字
  6. python每条语句以什么结尾_c语言每条语句以什么结束
  7. Clickhouse 查询表的列名
  8. 小程序再升级:支持创建微信小店小程序
  9. java动画代码_利用Java制作字符动画实例代码
  10. Understanding Diffusion Models