第8章指针.ppt
《第8章指针.ppt》由会员分享,可在线阅读,更多相关《第8章指针.ppt(93页珍藏版)》请在三一文库上搜索。
1、第8章 指 针,8.1 地址和指针的概念 8.2 变量的指针和指向变量的指针变量 8.3 数组的指针和指向数组的指针变量 8.4 字符串的指针和指向字符串的指针变量 8.5 函数的指针和指向函数的指针变量 8.6 返回指针值的函数 8.7 指针数组和指向指针的指针 习题,8.1 地址和指针的概念,内存:内部存储器,由存储单元组成。存储单元是 线性连续的。存储单元的最小单位是字节。 计算机中对不同存储单元的区分:给每个存储单元 编号,根据编号找到相应的存储单元(即内存地址)。,int i=10; char ch=A; float f1=3.14;,printf(”%f”,f1);,int i,j
2、,k;,printf(”%d”,i);,scanf(“%d“,k=i+j;,int *i_pointer; i_pointer=,为了表示将数值3送到变量中,可以有两种表达方法: (1) 将3送到变量i所标志的单元中。 (2) 将3送到变量i_pointer所“指向”的单元。 由于通过地址能找到所需的变量单元,我们可以说,地址“指向”该变量单元。因此在C语言中,将地址形象化地称为“指针” 。,如果有一个变量专门用来存放另一变量的地址(即 指针),则它称为“指针变量”。,回第八章,8.2 变量的指针和指向变量的指针变量 如前所述,变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另
3、一个变量。为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。,*i_pointer也代表一个变量,它和变量i是同一回事。下面两个语句作用相同: i=3; *i_pointer=3;,int i,*i_pointer; i_pointer=,8.2.1 定义一个指针变量 C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的。必须将它定义为“指针类型”。 int i,j; int *pointer_1
4、,*pointer_2; 定义指针变量的一般形式为: 基类型 *指针变量名,float *pointer_3; char *pointer_4; 指针变量指向另一个变量: pointer_1= 将变量i的地址存放到指针变量pointer_1 中,因此pointer_1 就“指向”了变量i。 同样,pointer_2 就“指向”了变量j。,在定义指针变量时要注意两点: (1) 指针变量前面的“*”,表示该变量的类型为指针型变量。注意:指针变量名是pointer_1、pointer_2,而不是*pointer_1、*pointer_2。 (2) 在定义指针变量时必须指定基类型。,指针变量中只能存放
5、地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。下面的赋值是不合法的: pointer_1=100; 有两个有关的运算符: (1) &: 取地址运算符。 (2) *: 指针运算符(或称“间接访问”运算符)。 例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。,8.2.2 指针变量的引用,例8.1通过指针变量访问整型变量。 #include int main( ) int a,b; int *pointer_1, *pointer_2; a=100;b=10; pointer_1= ,100,10 100,10,下面对“”语句,若有 &*pointer_1
6、 它的含义是什么?,“,(2) *&a的含义是什么?先进行&a运算,得a的地址,再进行*运算。即&a所指向的变量,*&a和*pointer_1 的作用是一样的 ( 假设已执行了“pointer_1=&a”),它们等价于变量a。即*&a与a等价。,(3) (*pointer_1)+相当于a+。 *pointer_1+ 相当于*(pointer_1+)。由于+在pointer_1的右侧,是“后加”,因此先对pointer_1的原值进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。 指针变量应用的例子: 例8.2输入a和b两个整数,按先大后小的顺序输出a和
7、b。,#include int main() int *p1,*p2,*p,a,b; scanf(“%d,%d“, ,5,9 a=5,b=9 max=9,min=5,交换前 交换后,8.2.3 指针变量作为函数参数 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。 例8.3 对输入的两个整数按大小顺序输出。 用函数处理,用指针类型的数据作函数参数。 程序如下:,#include swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; int main() int a,
8、 b, *pointer_1, *pointer_2; scanf(“%d, %d“, ,5,9 9,5,p1,p1,swap(int *p1,int *p2) int temp; *temp=*p1; *p1=*p2; *p2=*temp; ,swap(int x,int y) int temp; temp=x; x=y; y=temp; ,通过函数调用得到n个要改变的值 228页,练习(1): #include void sub(int x,int y,int *z) *z=y-x; int main() int a,b,c; sub(10,5,-5,-12,-7,练习(2): #incl
9、ude void fun(char *a,char *b) a=b; (*a)+; int main( ) char c1=A,c2=a,*p1,*p2; p1= ,Ab,回第八章,8.3 数组的指针和指向数组的指针变量,指向数组元素的指针 int a10; int *p; /*定义p为指向整型变量的指针变量*/ p=,int *p=,通过指针引用数组元素 假设p已定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。如果有以下赋值语句: *p=1; C规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素.,float a10,*p,*q; p=a; q=p+
10、1; q=p+5;,int a10,*p; p=,p+i a+i,*(p+i) *(a+i),ai,如果p的初值为&a0,则: (1) p+i和a+i就是ai的地址,它们指向a数组的第i个元素。a代表数组首地址,a+i也是地址,它的实际地址为a+iD。 (2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。例如,*(p+5)或*(a+5)就是a5。,(3) 指向数组的指针变量也可以带下标,如pi与*(p+i)等价。,引用一个数组元素,可以用: (1) 下标法,如a0、a5、a1+1。 (2) 指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组的指针变量,其
11、初值p=a。,例8.5 输出数组中的全部元素。假设有一个a数组, 整型,有10个元素。输出各元素的值,(1) 下标法。,#include int main() int a10; int i; for(i=0;i10;i+) scanf(“%d“,,(2) 通过数组名计算数组元素地址,找出元素的值。 #include int main( ) int a10; int i; for(i=0;i10;i+) scanf(“%d“, ,(3) 用指针变量指向数组元素。 #include int main( ) int a10; int *p,i; for(i=0;i10;i+) scanf(“%d“,
12、 ,三种方法的比较 (课后看234页),使用指针变量时,注意: (1) 指针变量可以实现使本身的值改变。例如,上述第3种方法是用指针变量p来指向元素,用p+使p的值不断改变。如果不用p而使a变化(例如,用a+)行不行呢?假如将上述3)程序的最后两行改为 for(p=a;a(p+10);a+) printf(“%d“,*a);,(2) 要注意指针变量的当前值。 例8.6 通过指针变量输出a数组的10个元素。 #include int main( ) int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); printf(“n“); for(i=0;i1
13、0;i+,p+) printf(“%d “,*p); return 0;,1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483,#include int main() int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); printf(“n“); p=a; for(i=0;i10;i+,p+) printf(“%d “,*p); return 0; ,(3) 从上例可以看到,虽然定义数组时指定它包含10个元素,可以用p指向当前的数组元素。但是实际上指针变量p可以指向
14、数组以后的内存单元。如果引用数组元素a10,C编译程序并不认为非法,但会使程序得不到预期的结果。,(4) 注意指针变量的运算。 若有 p=a;/*前提*/ p+; b=*p;,for(i=0;i10,i+) printf(“%d “,*p+);,p, *p+ 等价于 *(p+) b=*p+; c=*p; 例: for(i=0;i10;i+,p+) printf(“%d “,*p);, *(+p) 先使p加1,再取*p。 b=*(+p);, (*p)+ b=(*p)+;,p, 如果p当前指向a数组中第i个元素,则: *(p-):相当于ai-,先对p进行“*”运算,再使p自减。 *(+p):先使p
15、自加,再进行“*”运算。 *(-p):先使p自减,再进行“*”运算。,b=5 a0=6,输出a数组100个元素: p=a; p=a; while(pa+100) 或 while(pa+100) printf(”%d”,*p+); printf(“%d“,*p); p+;,用数组名作函数参数 数组名可以用作函数的形参和实参。如: #include int main( ) int f(int arr ,int n) int array10; int f(int arr ,int n) ; f(array,10); ,例8.8从10个数中找出其中最大值和最小值。 本题不要求改变数组元素的值,只要求得
16、到最大值和最小值。但是调用一个函数只能得到一个返回值,为了能得到两个结果值,今用全局变量在函数之间“传递”数据。程序如下:,#include int max,min; /*全局变量*/ void max_min_value(int array ,int n) int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;parray_end;p+) if(*pmax) max=*p; else if(*pmin) min=*p; return; ,int main() int i,number10; void max_m
17、in_value(int array ,int n); printf(“enter 10 integer numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,enter 10 integer numbers: -2 4 6 8 0 -3 45 67 89 100 max=100,min=-3,函数max_min_value的形参array可以改为指针变量类型。即将该函数首部改为 void max_min_value(int *array,int n) 效果相同。 实参也可以不用数组名,而用指针变量传递地址,形参仍用指针变量。 P239 表,归纳起来,如果有一个实
18、参数组,想在函数中改变此数组的元素的值,实参与形参的表示形式有以下4种情况:,(1) 形参和实参都用数组名,如: int main() f(int x ,int n) int a10; f(a,10); ,(2) 实参用数组名,形参用指针变量。如: int main() f(int *x,int n) int a10; f(a,10); ,(3) 实参形参都用指针变量。例如:,int main() f(int *x,int n) int a10, *p; p=a; f(p,10); ,(4) 实参为指针变量,形参为数组名。如:,int main() f(int x ,int n) int a1
19、0,*p; p=a; f(p,10); ,例8.10用选择法对10个整数排序,#include int main( ) int *p,i,a10; p=a; for(i=0;i10;i+) scanf(“%d“,p+); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(“%d“,*p); p+; return 0; ,sort(int x ,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(xjxk) k=j; if(k!=i) t=xi;xi=xk;xk=t; ,12 15 2
20、4 56,sort(int *x,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(*(x+j)*(x+k) k=j; if(k!=i) t=*(x+i);*(x+i)=*(x+k);*(x+k)=t; ,12 15 2 4 56,以下程序的运行结果是:,#include int main() int a10=1,2,3,4,5,6,7,8,9,10,*p=a; printf(”%dn”,*(p+2); return 0; ,3,指向多维数组的指针和指针变量 1. 多维数组的地址 int a34;,a: 0行首地址 a+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针
链接地址:https://www.31doc.com/p-3133668.html