大纲浏览

①数组元素的指针②在引用数组元素时指针的运算③通过指针引用数组元素④用数组名作函数参数⑤通过指针引用多维数组

①数组元素的指针

一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址

指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)

所谓数组元素的指针就是数组元素的地址

注意:
p=&a[0]等价于p=a(p的值是数组a首元素a[0]的地址)

②在引用数组元素时指针的运算

在指针指向数组元素时,允许以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p–,--p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)

③通过指针引用数组元素

引用一个数组元素,可用下面两种方法:
(1) 下标法,如a[i]形式
(2) 指针法,如*(a+i)或*(p+i)
其中a是数组名,p是指向数组元素的指针变量,其初值p=a

有关③的例题: 有一个整型数组a,有10个元素,要求输出数组中的全部元素。

解题思路:引用数组中各元素的值有3种方法:
(1)下标法;
(2)通过数组名计算数组元素地址,找出元素的值;
(3) 用指针变量指向数组元素
方法一:下标法
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{int a[10],i;printf("请输入10个整数:");for(i=0;i<10;i++){scanf("%d",&a[i]);}for(i=0;i<10;i++){printf("%3d",a[i]);}
}
方法二:通过数组名计算数组元素地址,找出元素的值
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{int a[10],i;printf("请输入10个整数:");for(i=0;i<10;i++){scanf("%d",a+i);//a+i可以换为&a[i]}for(i=0;i<10;i++){printf("%3d",*(a+i));}}
方法三:用指针变量指向数组元素
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{int a[10],*p;printf("请输入十个整数:");// for(i=0;i<10;i++){//scanf("%d",&a[i]);//&a[i]可以换为a+ifor(p=a;p<(a+10);p++){scanf("%d",p);}//上面的p++结束后,需要对p重新初始化,令p=afor(p=a;p<(a+10);p++){printf("%3d",*p);}
}

有关③的例题: 通过指针变量输出整型数组a的10个元素。

解题思路:
用指针变量p指向数组元素,
通过改变指针变量的值,使p先后指向a[0]到a[9]各元素。
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{int a[10],i,*p=&a;//此处的*p=&a等同于  int *p; p=a;printf("请输入10个整数:");for(i=0;i<10;i++){scanf("%d",p++);}p=a;//上面的p++后要使p=a进行初始化后面才能正常使用for(i=0;i<10;i++,p++){printf("%3d",*p);}
}

④用数组名作函数参数

用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量

C编译都是将形参数组名作为指针变量来处理的

 实参数组名是指针常量,但形参数组名是按指针变量处理
在函数调用进行虚实结合后,它的值就是实参数组首元素的地址
在函数执行期间,形参数组可以再被赋值
void fun (arr[ ],int n)
{ printf(″%d\n″, *arr); arr=arr+3;                printf(″%d\n″, *arr);
}

有关④的例题: 将数组a中n个整数按相反顺序存放

解题思路:将a[0]与a[n-1]对换,……将a[4]与a[5]对换。
/* Note:Your choice is C IDE */
#include "stdio.h"
void fan(int b[],int n);//函数的调用
void main()
{int i,a[10]={1,3,4,5,2,6,8,7,9,-6};//先将这10个数输出来for(i=0;i<10;i++) printf("%3d",a[i]);printf("\n");fan(a,10);for(i=0;i<10;i++)printf("%3d",a[i]);
}
void fan(int x[],int n)
{int t,i,j,m=(n-1)/2;for(i=0;i<=m;i++){//也可以令m=n/2;则变为i<m;j=n-1-i;t=x[i];x[i]=x[j];x[j]=t;}
}
注意,上面的fan函数可以进行优化
void fan(int x[],int n)
{int t,*i,*j;i=x;//数组x[]的第一个元素即x[0]j=x+n-1;for(i=x;i<j;i++,j--){t=*i;*i=*j;*j=t;}
}
结果显示1  3  4  5  2  6  8  7  9 -6-6  9  7  8  6  2  5  4  3  1
对上面的代码进行改写,用指针变量作实参
/* Note:Your choice is C IDE */
#include "stdio.h"
void fan(int *x,int n);
void main()
{int i,a[10],*p=a;//指针p指向a[0]for(i=0;i<10;i++,p++)scanf("%d",p);p=a;//必不可少,指针变量p重新指向a[0]fan(p,10);//调用,实参p是指针变量for(p=a;p<a+10;p++) printf("%3d",*p);
}
void fan(int *x,int n)//定义fan函数,形参x是指针变量
{int *y,*i,*j,t,m;m=(n-1)/2;i=x;j=x+n-1;y=x+m;for(i=x;i<=y;i++,j--){//i,x,y,j都是地址,所以不能用i<=m,因为m是实数t=*i;*i=*j;*j=t;}
}

有关④的例题: 用指针方法对10个整数按由大到小顺序排序。

解题思路:
在主函数中定义数组a存放10个整数,定义int *型指针变量p指向a[0]
定义函数sort使数组a中的元素按由大到小的顺序排列
在主函数中调用sort函数,用指针p作实参
用选择法进行排序
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{int i,a[10],*p=a;//直接对p进行了初始化,相当于p=aprintf("请输入10个整数:");for(i=0;i<10;i++)scanf("%d",p++);p=a;//指针变量p重新指向a[0]sort(p,10);for(p=a;p<a+10;p++)//指针变量p重新指向a[0]printf("%3d",*p);
}
void sort(int x[],int n)
{int i,j,k,t;for(i=0;i<n-1;i++){//进行9次循环,实现9趟比较k=i;for(j=i+1;j<n;j++)  //在每一趟中进行9-i次比较if(x[j]>x[k])  k=j;//x[j]>x[k]可以改为x[j]>x[i]if(k!=i){t=x[i];x[i]=x[k];x[k]=t;}}
}
上面的代码比较复杂难以理解,下面进行优化
进行整改将sort函数用冒泡排序的方法
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{int i,a[10],*p=a;//直接对p进行了初始化,相当于p=aprintf("请输入10个整数:");for(i=0;i<10;i++)scanf("%d",p++);p=a;//指针变量p重新指向a[0]sort(p,10);for(p=a;p<a+10;p++)//指针变量p重新指向a[0]printf("%3d",*p);
}
void sort(int x[],int n)//使用冒泡排序的方法
{int i,j,k,t;for(i=0;i<n-1;i++){//进行9次循环,实现9趟比较for(j=0;j<n-1-i;j++)  //在每一趟中进行9-i次比较if(x[j+1]>x[j]){t=x[j];x[j]=x[j+1];x[j+1]=t;}}
}
鉴于上面运算的复杂性,先使用改用指针变量的方式求解
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{int i,a[10],*p=a;//直接对p进行了初始化,相当于p=aprintf("请输入10个整数:");for(i=0;i<10;i++)scanf("%d",p++);p=a;//指针变量p重新指向a[0]sort(p,10);for(p=a;p<a+10;p++)//指针变量p重新指向a[0]printf("%3d",*p);
}
void sort(int *x,int n)
{int i,j,k,t;for(i=0;i<9;i++){k=i;for(j=i+1;j<n;j++)if (*(x+j)>*(x+k)) k=j;if(k!=i){t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;}}
}

通过指针引用数组(包含多种例子,清晰易懂)相关推荐

  1. c语言中通过指针引用数组,C语言基础(二)

    指针引用数组 C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素. 引入指针变量后,就可以用两种方法来访问数组元素了.如果p的初值为&a[0],则: p+i和 ...

  2. c语言指针引用数组元素,c语言——数组指针和通过指针引用数组元素的方法总结...

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? int (* p)[10]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 1 拓展:有指针类型元素的数组称为指针数组. ...

  3. C语言指针基础知识点(四)--通过指针引用数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  4. C语言:指针引用数组元素

    题目概述: 有一整数型数组a,有10个元素,要求输出数组中全部元素 编程: #include<stdio.h> int main() { int a[10]; int i; printf( ...

  5. C语言指针基础知识点(六)--通过指针引用多维数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  6. C语言指针操作(四)通过指针引用字符串

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰. 学习日记 目录 学习日记 前言​编辑 一.字符串的引用方式 例1 例2 二.字符指针作函数参数 用函数调用实现字符串的 ...

  7. 哈工大c语言指针实验题,C语言程序设计_哈工大(2):指针与数组.pdf

    圳 职 业 技 术 学 院Shenzhen Polytechnic 七单元(2):指针与数组 教学内容 指针与数组 教学目标 应知 数组的指针的意义,数组元素的指针的意义,数组名作函 数参数 应会 通 ...

  8. C语言指针基础知识点(七)--通过指针引用字符串

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  9. C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

    目录 零.前言 一.指针的定义 二.指针类型的意义 1.指针类型决定了指针解引用时一次访问几个字节. 2.指针类型决定了指针加减整数时的步长 三.野指针 1.未初始化的指针 2.指针的越界访问 3.指 ...

最新文章

  1. 【Socket网络编程】16.UDP 循环读取recvfrom() 与 循环发送 sendto()
  2. 初级,用powerdesigner生成的sql创建access数据库
  3. 工作流的节点关系详解
  4. c语音学习-输入一个小写字母,输出其对应的大写字母
  5. 棋牌游戏框架解析(一)
  6. java 批量爬虫_签名图片一键批量生成 使用Java的Webmagic爬虫实现
  7. 豆瓣高分JAVA书籍,值得收藏
  8. Android Camera HAL3 - 框架流程预览
  9. git与github的使用方法
  10. layui怎么给下拉框赋值_layui给select下拉框赋值
  11. JavaScript网页特效-“渔夫打鱼晒网”程序设计
  12. Codeforces 712A Memory and Crow
  13. VS中怎么将一个页面设置为起始页的解决方案以及关于粘贴的小窍门
  14. 三维电影特效动画制作软件——Houdini 17.5
  15. linux模拟器玩三国战记,三国战纪手游下载(街机)-三国战纪安卓官网版v0.14.30.0-Linux公社...
  16. win10保存文件需要管理员权限无法保存
  17. 在linux下怎么解压和压缩tar.xz文件
  18. 理财--指数基金那点事
  19. 哈尔滨市贯日儿童影楼管理系统
  20. 有关对梯度、散度、旋度的纯数学理解

热门文章

  1. 王权富贵:使用终端向服务器传送文件
  2. 单片机 ADXL346 IIC通讯
  3. iOS开发系列–音频播放、录音、视频播放、拍照、视频录制
  4. 怎么样挑选关键才才能让网站优化效果超凡出众
  5. 【HuggingFace轻松上手】基于Wikipedia的知识增强预训练
  6. 计算机在餐饮业的应用,餐饮会员管理系统在餐饮业的应用
  7. 三国志战略版:不怕当锋的武将 官渡之战新武将_SP吕蒙、董白
  8. 同步的特点,好处,弊端
  9. Spring官网获取jar包以及source文件
  10. matplotlib小抄与实战