版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单元七
指针导学【问题】
定义一个整型变量a,如何知道分配给变量a的存储空间的地址编码是多少?如何通过指针对变量a进行操作?2指针变量的应用目录1如何定义指针变量7.1.1内存地址与指针(1)内存地址
在计算机中,内存空间的最小单位为字节,操作系统会为每个字节的内存空间进行编号,这个编号就是内存地址。变量存储空间的第一个字节对应的内存地址可看作是存储地址。
内存空间10001001内存地址inta;//占用4个字节charc;//占用1个字节1002100310047.1.1内存地址与指针(2)指针与指针变量
根据存储地址可以访问相应的存储单元,所以通常也把地址称为指针。C语言允许定义一个变量来存放指针,这种变量就称为指针变量。1000P110001001内存地址10021003指针变量
内存空间charc;//占用1个字节inta;//占用4个字节1001P210047.1.2指针变量的定义与初始化(1)指针变量的定义定义指针变量的一般格式:
类型名
*变量名;类型名:表示该指针变量只能保存该类型变量的指针。*:表示该变量是指针变量,只能保存地址数据。变量名:表示指针变量的名称,变量名的命名需遵循标识符命名规则。int*p1;//p1是指向整型数据的指针变量char*p2;//p2是指向字符型数据的指针变量7.1.2指针变量的定义与初始化(2)指针变量的初始化第一种:定义指针变量的同时进行初始
第二种:先定义指针变量,然后再进行初始
int*p=NULL;//指针初始化为空inta=5;//定义整型变量aint*p;//定义指针变量p
p=&a;//p指向变量aint*p=&a;等价于7.1.3指针变量的引用指针变量的运算符有两个:“*”和“&”。“*”是指针运算符,也称为间接引用操作符,它返回指针指向的变量的值。“&”是取地址运算符,它返回运算对象的内存地址。inta=5,b,*p;p=&a;//指针变量p指向a的地址b=*p;//将p所指向变量a的值赋给b注:定义指针变量和引用指针变量都有符号“*”,但含义不同,前者是指针类型的
表示符,表示p是一个指针变量,后者表示指针变量所指向的变量。7.1.3指针变量的引用#include<stdio.h>intmain(){
inta=5;
//定义整型变量a,并进行初始化
int*p1,*p2;//定义两个指针变量p1、p2
p1=&a;//对p1进行初始,p1指向变量a
p2=p1;
//将指针变量p1的值赋给p2,p2指向变量a
printf("*p1=%d\n*p2=%d",*p1,*p2);
return0;}【例7-1】对指针变量的操作运行结果:7.1.3指针变量的引用#include<stdio.h>intmain(){
inta=5;
int*p1,*p2;
p1=&a;
p2=p1;
printf("*p1=%d\n*p2=%d\n",*p1,*p2);
scanf("%d",p1);//输入10
printf("*p1=%d\n*p2=%d\n",*p1,*p2);
return0;}【例7-2】对指针变量指向的变量的操作运行结果:7.1.3指针变量的引用#include<stdio.h>voidswap(int*p1,int*p2)//自定义函数swap{
inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;}intmain(){
inta=5,b=10;
printf("a=%db=%d\n",a,b);
swap(&a,&b);//调用自定义函数
printf("a=%db=%d\n",a,b);
return0;}【例7-3】利用自定义函数交换两个变量的值运行结果:7.1.3指针变量的引用#include<stdio.h>voidswap(inta,intb){
inttemp;
temp=a;
a=b;
b=temp;}intmain(){
inta=5,b=10;
printf("a=%db=%d\n",a,b);
swap(a,b);
printf("a=%db=%d\n",a,b);
return0;}【思考】以下以下程序是否可以完成两个变量值的交换运行结果:1如何定义指针变量目录2指针变量的应用7.2.1一维数组与指针(1)建立指针与数组的关系p=a;inta[5];int*p;//建立数组a与指针p之间的关系等价于p=&a[0];如何建立数组a与指针p之间的关系?p
p+1
a+1p+2
a+2p+3
a+3p+4
a+4a[1]a[0]a[2]a[3]a[4]
数组a[5]a内存单元7.2.1一维数组与指针(2)指针运算数组名a表示数组的初始地址,p指向数组的第一个元素a[0],p+1指向下一个数组元素a[1]。p+1、p-1并不是数学中计算,而是表示移动一个“单元”,对于int类型来讲,p和p+1相差4个字节,若数组的初始地址为1000,那么p+1的值为1004。地址间关系:&a[0]<==>a<==>p;&a[i]<==>a+i<==>p+i;元素间关系:a[0]<==>*a<==>*p;a[i]<==>*(a+i)<==>*(p+i);p
p+1
a+1p+2
a+2p+3
a+3p+4
a+4a[1]a[0]a[2]a[3]a[4]
数组a[5]a内存单元7.2.1一维数组与指针(3)利用指针变量访问数组#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};inti;
int*p;
p=a;
for(i=0;i<=4;i++)
{
printf("元素a[%d]的地址:%p,值为:%d\n",i,p+i,*(p+i));
}
return0;}【例7-5】利用指针变量p访问数组a7.2.1一维数组与指针#include<stdio.h>voidmax(int*p,intn){
inti,max=*p;
for(i=0;i<n;i++)
{
if(max<*(p+i))
max=*(p+i);
}
printf("最大值为%d",max);}intmain(){
inta[5]={1,2,3,4,5};max(a,5);
return0;}【例7-6】利用指针变量p寻找数组a中的最大值7.2.2二维数组与指针(1)二维数组中所蕴含的地址关系inta[3][3]={1,2,3,4,5,6,7,8,9};二维数组a由3个元素组成:a[0]、a[1]、a[2]a[0]包含有
3
个元素:a[0][0]、a[0][1]、a[0][2]a[0]a[1]a[2]123456789a7.2.2二维数组与指针(1)二维数组中所蕴含的地址关系a代表二维数组的首地址,也是二维数组第0行的首地址。a+1代表第1行的首地址。aa+1a+210001个整型变量占4个字节,一行12占用个字节10121024a[0]a[1]a[2]1234567897.2.2二维数组与指针(1)二维数组中所蕴含的地址关系a[0]代表二维数组第0行的首地址,a[i]代表第i行的首地址。a[0]也代表第0行第0个元素地址,a[0]+i代表第0行的第i个元素地址。123456789a[0]1000a[0]+1a[0]+2a[1]a[2]7.2.2二维数组与指针(1)二维数组中所蕴含的地址关系二维数组元素a[i][j]的地址以及值的表示归纳总结为:地址表示方法:&a[i][j]<==>a[i]+j<==>*(a+i)+j值表示方法:a[i][j]<==>*(a[i]+j)<==>*(*(a+i)+j)7.2.2二维数组与指针(2)指针在二维数组中的应用---指针数组定义:数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组定义的一般格式:int*p[n];
注意:[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素,为p[0]、p[1]、p[2]...p[n-1],而且它们都是指针变量,用来存放变量地址。7.2.2二维数组与指针【例7-7】利用指针数组遍历二维数组a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){
inta[3][3]={1,2,3,4,5,6,7,8,9};int*p[3];//定义一个指针数组inti,j;
for(i=0;i<3;i++)
p[i]=a[i];
//数组指针赋初值,为二维数组每行地址
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",*(p[i]+j));
printf("\n");}
return0;}运行结果:(2)指针在二维数组中的应用---行指针定义:行指针也称为数组指针,指的是数组名的指针,即数组首元素地址的指针。行指针定义的一般格式:int(*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,可以说是p的步长。当执行p+1时,p要跨过n个整型数据的长度。7.2.2二维数组与指针7.2.2二维数组与指针【例7-7】利用行指针遍历二维数组a[3][3]={1,2,3,4,5,6,7,8,9}#include<stdio.h>intmain(){
inta[3][3]={1,2,3,4,5,6,7,8,9};
int(*p)[3];//定义一个行指针p,指向一个二维数组,[3]表示指针指向的行包含的元素个数
inti,j;p=a;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",*(*(p+i)+j));
printf("\n");}
return0;}运行结果:7.2.3字符串与指针“helloworld!"
由双引号括起来的字符序列
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论