最新C语言第八章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
21
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–指针运算的几个注意事项
指针指向的地址,必须是程序已经申请的可用地址
–指向变量的指针,不能进行加减运算 –若指针指向数组,则可以进行加、减运算。运算的范围
12
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
传值:函数无法改变实参的值,不能实现 全局变量:可以实现,但函数独立性差
–函数的调用必须使用在函数之外定义的全局变量 –全局变量的定义必须符合函数要求的名称
传址:利用传址的特性,可以实现要求,同时保持 了函数的独立性
– 指针的运算:仅有加减法运算
指针的算术运算,并非单纯的地址运算,而是同时 涉及指针的地址、类型的一种运算
指针变量+1,是指指针指向的地址位置为下一个数 据位。
指针变量+1,要根据指针类型的长度来确定实际地 址的增减量
即有
– (p+n)的地址=p的地址+sizeof(p的类型)*n
18
8.3 通过指针引用数组
– 指向数组元素的指针
将数组元素的地址赋给指针
– 若有int a[5] ,*p 则可以:p=&a[3]
其使用和指向变量的指针没有区别
–指向数组的指针
指向数组首地址的指针,称为指向数组的指针 数组的名称,就是一个指向数组首地址的指针
17
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
19
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–数组元素的访问,就是通过对这个首地址进行 计算,得到数组元素的确定位置后进行的
– 访问数组元素的两种方式
数组变量引用: 数组变量名[下标] 指针变量引用:*(指向数组的指针+下标) 对于数组a[10],若指针变量p=a,则有:
a==&a[0] *a==a[0] a+5==&a[5] *(a+5)==a[5] p==&a[0] *p==a[0] p+5==&a[5] *(p+5)==a[5]
printf("a=%d,b=%d",a,b); }
14
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
变量交换函数
void swap(int *p1, int *p2) {
int temp; //形参指针p1和实参指针pa的指向相同 //形参指针p2和实参指针pb的指向相同
C语言第八章
8.1 什么是指针
有关指针的一些概念
– 指针:
C语言中,将地址形象化的称为指针
– 通过指针找到数据,就是通过地址找到数据
– 指针变量:
存放指针的变量,称之为指针变量
– 指针变量里面存放的是指针,也就是地址
– 为什么使用指针
更方便、更主动的操作数据、构建数据结构
2
8.2 指针变量
10
8.2 指针变量
8.2.4 指针变量作为函数参数
– 复习:函数参数的传值与传址方式
传值:传递后形参不影响实参 传址:传递后实参、形参指向同一地址 利用传址的特点,改变形参指针指向数据的内容,
即可改变对应实参指针指向的内容 利用传址方式,可以让函数在保持独立性的同时,
实现对主程序中的数据进行批量修改的功能。
temp=*p1; //将p1指向地址的值存放到临时变量temp中 *p1=*p2; //将p2指向地址的值放到p1指向的地址中 *p2=temp; //将变量temp的值放到p2指向的地址中
}
15
8.2 指针变量
8.2.4 指针变量作为函数参数
16
8.3 通过指针引用数组
8.3.1 数组元素的指针
8.3.2 通过指针引用数组元素
– 指针的运算:仅有加减法运算
有如下定义:int a[5],*p;p=a; 若p指向的地址为数组首地址2000H 则p+1的地址为
–2000H+sizeof(int)*1=2004H, –不是单纯的2000H+1H=2001H
同样:p+4的地址为
–2000H+sizeof(int)*4=2016H
–函数的参数必须是指针 –形参、实参的值均没有改变,改变的是地址中的值
13
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
主程序
void main() { int a,b *pa,*pb; scanf("%d,%d",&a,&b);
pa=&a; pb=&b; //指针pa指向变量a、pb指向变量b swap(pa,pb); //传递指针变量到函数
11
8.2 指针变量
8.2.4 指针变量作为函数参数
– 指针作为函数参数,是一种传址方式。 – 利用实参形参指向同一地址的特性,使函特性,将要改变的 变量的地址作为实参,传递给下层调用函数
函数的参数也必须为指针,通过在函数中改变指针 指向的数据的值,就改变了实参指向数据的值,也 就改变了实参所在函数中变量的值
8.2.3 指针变量的引用
– 一般情况下,不能将地址值直接赋给变量
若有 int a,*p; 则:&a=1000 p=2000是错误的
– 指针不会单独使用,常和其他普通变量关联在 一起使用
关联方式:p=&a 使用指针,必须要先给其一个地址,再访问地址中
的数据,如同使用变量必须有一个确定值一样
20
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–不同方式访问的程序
int i,a[5]={6,7,8,9,0},*p=a; for(i=0;i<5;i++) {
printf("a[%d]=%-4d",i,a[i]); printf("*(a+%d)=%-4d",i,*(a+i)); printf("*(p+%d)=%-4d",i,*(p+i)); printf("\n"); }
9
8.2 指针变量
8.2.3 指针变量的引用
– 指针和变量的几个换算关系:
对于变量,有:名称=数据、&名称=地址 对于指针,有:名称=地址、*名称=指向的数据 若有定义:int a, *p 则:
– &a、p 是同一类型数据,为地址 –a、*p 是同一类型数据,为整型数据
一般情况下,使用p=&a的形式,让指针与变量关联, 使用*p的形式,访问指向的数据
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–指针运算的几个注意事项
指针指向的地址,必须是程序已经申请的可用地址
–指向变量的指针,不能进行加减运算 –若指针指向数组,则可以进行加、减运算。运算的范围
12
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
传值:函数无法改变实参的值,不能实现 全局变量:可以实现,但函数独立性差
–函数的调用必须使用在函数之外定义的全局变量 –全局变量的定义必须符合函数要求的名称
传址:利用传址的特性,可以实现要求,同时保持 了函数的独立性
– 指针的运算:仅有加减法运算
指针的算术运算,并非单纯的地址运算,而是同时 涉及指针的地址、类型的一种运算
指针变量+1,是指指针指向的地址位置为下一个数 据位。
指针变量+1,要根据指针类型的长度来确定实际地 址的增减量
即有
– (p+n)的地址=p的地址+sizeof(p的类型)*n
18
8.3 通过指针引用数组
– 指向数组元素的指针
将数组元素的地址赋给指针
– 若有int a[5] ,*p 则可以:p=&a[3]
其使用和指向变量的指针没有区别
–指向数组的指针
指向数组首地址的指针,称为指向数组的指针 数组的名称,就是一个指向数组首地址的指针
17
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
19
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–数组元素的访问,就是通过对这个首地址进行 计算,得到数组元素的确定位置后进行的
– 访问数组元素的两种方式
数组变量引用: 数组变量名[下标] 指针变量引用:*(指向数组的指针+下标) 对于数组a[10],若指针变量p=a,则有:
a==&a[0] *a==a[0] a+5==&a[5] *(a+5)==a[5] p==&a[0] *p==a[0] p+5==&a[5] *(p+5)==a[5]
printf("a=%d,b=%d",a,b); }
14
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
变量交换函数
void swap(int *p1, int *p2) {
int temp; //形参指针p1和实参指针pa的指向相同 //形参指针p2和实参指针pb的指向相同
C语言第八章
8.1 什么是指针
有关指针的一些概念
– 指针:
C语言中,将地址形象化的称为指针
– 通过指针找到数据,就是通过地址找到数据
– 指针变量:
存放指针的变量,称之为指针变量
– 指针变量里面存放的是指针,也就是地址
– 为什么使用指针
更方便、更主动的操作数据、构建数据结构
2
8.2 指针变量
10
8.2 指针变量
8.2.4 指针变量作为函数参数
– 复习:函数参数的传值与传址方式
传值:传递后形参不影响实参 传址:传递后实参、形参指向同一地址 利用传址的特点,改变形参指针指向数据的内容,
即可改变对应实参指针指向的内容 利用传址方式,可以让函数在保持独立性的同时,
实现对主程序中的数据进行批量修改的功能。
temp=*p1; //将p1指向地址的值存放到临时变量temp中 *p1=*p2; //将p2指向地址的值放到p1指向的地址中 *p2=temp; //将变量temp的值放到p2指向的地址中
}
15
8.2 指针变量
8.2.4 指针变量作为函数参数
16
8.3 通过指针引用数组
8.3.1 数组元素的指针
8.3.2 通过指针引用数组元素
– 指针的运算:仅有加减法运算
有如下定义:int a[5],*p;p=a; 若p指向的地址为数组首地址2000H 则p+1的地址为
–2000H+sizeof(int)*1=2004H, –不是单纯的2000H+1H=2001H
同样:p+4的地址为
–2000H+sizeof(int)*4=2016H
–函数的参数必须是指针 –形参、实参的值均没有改变,改变的是地址中的值
13
8.2 指针变量
8.2.4 指针变量作为函数参数
– 例:用函数实现两个变量交换。
主程序
void main() { int a,b *pa,*pb; scanf("%d,%d",&a,&b);
pa=&a; pb=&b; //指针pa指向变量a、pb指向变量b swap(pa,pb); //传递指针变量到函数
11
8.2 指针变量
8.2.4 指针变量作为函数参数
– 指针作为函数参数,是一种传址方式。 – 利用实参形参指向同一地址的特性,使函特性,将要改变的 变量的地址作为实参,传递给下层调用函数
函数的参数也必须为指针,通过在函数中改变指针 指向的数据的值,就改变了实参指向数据的值,也 就改变了实参所在函数中变量的值
8.2.3 指针变量的引用
– 一般情况下,不能将地址值直接赋给变量
若有 int a,*p; 则:&a=1000 p=2000是错误的
– 指针不会单独使用,常和其他普通变量关联在 一起使用
关联方式:p=&a 使用指针,必须要先给其一个地址,再访问地址中
的数据,如同使用变量必须有一个确定值一样
20
8.3 通过指针引用数组
8.3.2 通过指针引用数组元素
–不同方式访问的程序
int i,a[5]={6,7,8,9,0},*p=a; for(i=0;i<5;i++) {
printf("a[%d]=%-4d",i,a[i]); printf("*(a+%d)=%-4d",i,*(a+i)); printf("*(p+%d)=%-4d",i,*(p+i)); printf("\n"); }
9
8.2 指针变量
8.2.3 指针变量的引用
– 指针和变量的几个换算关系:
对于变量,有:名称=数据、&名称=地址 对于指针,有:名称=地址、*名称=指向的数据 若有定义:int a, *p 则:
– &a、p 是同一类型数据,为地址 –a、*p 是同一类型数据,为整型数据
一般情况下,使用p=&a的形式,让指针与变量关联, 使用*p的形式,访问指向的数据