《C语言课程课件 第八章 地址和指针》由会员分享,可在线阅读,更多相关《C语言课程课件 第八章 地址和指针(20页珍藏版)》请在金锄头文库上搜索。
1、第8章 地址和指针 8.1 变量的地址和指针 8.2 指针变量的定义和指针变量的基类型 8.3 给指针变量赋值 8.4 对指针变量的操作 8.5 函数之间地址值的传递考试的重点8.1 变量的地址和指针计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个 编号,这个编号就成为内存地址。 内存空间 地址1010 1011 1012 1013 1014 1015 1016 : : :1200 1201 1202 1203 1204 1205例如:short a,b;float x;a=3;b=5;x=3.5;: : :2002 2003 2004 2005abx353.5每个变量的地址
2、是指该变量所占 存储单元的第一个字节的地址。在C语言中,我们可以定义整型变量、实型变量、字符变量。 他们都是用来存放数据的。 今天,我们来学习一下特殊的变量,这种变量只是用来存放 内存地址的。比如我们定义了一个指针变量pp占4个字节该变量中只能存放内存地址,比如把变量a的地址赋予指针 变量p,则指针变量p的值为1012。1012请问当访问变量a时,访问的是什么? 当访问指针变量p时,访问的是什么?3 1012当访问变量时,为“直接存取(直接访问)”。 我们也可以通过指针变量间接的访问该地址中原来的值。此时 称为“间接存取(间接访问)”。8.2 指针变量的定义和指针变量的基类型定义指针变量的一般
3、形式如下:类型名 *指针变量名; 或 类型名 *指针变量名1, *指针变量名2,;例如:int *pi;int *pj,*pa;1. pi,pj,pa都是变量,不过都是指针变量,定义时在普通变量名的左边加上星号就行了。说明:2. pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放int类型变量的地址。这时我们称int是指针变量pi,pj,pa的基类型。如:double *pd;char *s1,*s2;pd的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址。s1和s2的基类型为char类型,在指针变量s1和s2中,只能存放char类型变量的地址。8.
4、3 给指针变量赋值8.3.1 给指针变量赋地址值例如:int k,*q,*p; /*k为整型变量,q和p都是指针变量。*/qpkk=1;/*给普通变量赋值*/整型变量k只被能赋予整型值,赋值时直接赋值就可以 了,而指针变量只能被赋予地址值,如下是把整型变 量k的地址赋值给指针变量q。q=p=NULL; int *p; p=0; int *p; p=0; 注意此时,指针变量p中不是没有值,而是有一个“空”值。8.4 对指针变量的操作8.4.1 通过指针来引用一个存储单元#include main() int k,*q,*p;k=1;q=p=q;printf(“%dn%dn%dn“,k,q,p);
5、 1 1245052 1245052输出时,变量k为1,而指针变量q和p则为变量k的地址。#include main() int k,*q,*p;k=1;q=p=q;printf(“%dn%dn%dn“,k,*q,*p); 1kp= j=*p;/*定义了三个变量*/ /*取变量i的地址赋给指针变量p*/ /*间接访问指针变量中的值10赋给变量j*/p10ij10j=i;间接访问运算符*是一个单目运算符,必须出现在运算对象的左边。其运算对象 可以是存放地址的指针变量,也可以是地址。j=*(j=*扩展知识:j=*p+1;10j11jint *p,k=0; p=pk*p=100;1000k=100
6、;*p=*p+1;k=k+1;101*p+=1; 或 +*p; 或 (*p)+;k+=1; 或 +k; 或 k+;若有以下定义和语句: int *p,*s,k=20; s= p= ps 20k 在定义指针变量时,*指针变量名用于存 放普通变量的地址;*指针变量名用于存 放指针变量的地址; int *p,*s,k=10; s=pa=pb=pmin=scanf(“%d%d”,pa,pb);printf(“a=%d b=%dn”,a,b);*pmin=*pa;if(*pa*pb) *pmin=*pb;printf(“min=%dn”,min); papbpminabmin/*输入的值依次放入pa、p
7、b所指存储单元中*/scanf(“%d%d”,比如输入:41 324132a=41 b=32 min=a;41if(ab) min=b;32min=32 8.4 对指针变量的操作8.4.2 移动指针 p=pq=p+2; q+; q+; q-; p+;qqqp当有:int i,j,k;i=*p;j=*q;k=q-p;ijk22 44 2指针比较if(p int myadd(int *a,int *b) int sum;sum=*a+*b;return sum; main() int x,y,z;printf(“Enter x,y:”); scanf(“%d%d”,z=myadd(printf(“
8、%d+%d=%dn”,x,y,z); xyzEnter x,y: 24 4124 41调用传递absumsum=x+y;65退出函数,将变量sum的值作 为这个函数的返回值,返回到 他的调用处。此时,该函数中 的变量全部释放。65 6524+41=65 8.5 函数之间地址值的传递8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值例8.3 调用swap函数,交换主函数中变量x和y中的数据。 第七章例7.3的重写 #include void swap(int *,int *); main() int x=30,y=20;printf(“(1)x=%d y=%dn“,x,y);s
9、wap(printf(“(4)x=%d y=%dn“,x,y); void swap(int *a,int *b) int t;printf(“(2)a=%d b=%dn“,*a,*b);t=*a;*a=*b;*b=t;printf(“(3)a=%d b=%dn“,*a,*b); /*函数说明语句*/xy(1)x=30 y=20调用传递abt(2)a=30 b=20(3)a=20 b=30退出该函数,返回到它的调用处, 该函数无返回值,因为该函数为 void类型,此时该函数中的变量全 部释放。(4)x=20 y=30t =x;x=y;y=t;302020308.5 函数之间地址值的传递8.5.
10、2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值例8.4 编写函数order(int *a,int *b),使调用函数中的第一个实参总是存放两个数中 的较小的数,第二参数存放两个数中较大的数。 #include void swap(int *x1,int *x2) int t;t=*x1;*x1=*x2;*x2=t; void order(int *a,int*b) if(*a*b) swap(a,b); main() int x,y;printf(“Enter x,y:“); scanf(“%d%d“,printf(“x=%d y=%dn“,x,y);order(printf(“
11、x=%d y=%dn“,x,y); xyEnter x,y: 41 244124x=41 y=24 调用ab传递if(xy) swap(a,b);调用并传递数据x1x2t=x;x=y;y=t;2441x=24 y=41 8.5 函数之间地址值的传递8.5.3 函数返回地址值#include int *fun(int *,int *); main() int *p,i,j;printf(“Enter two number:“); scanf(“%d%d“,p=fun(printf(“i=%d,j=%d,*p=%dn“,i,j,*p); int *fun(int *a,int *b) if(*a*
12、b) return a;return b; /*函数说明*/例8.5 程序举例。pijEnter two number:99 10199101传递abif(ij) return a;退出该函数,返回到它的调用处, 该函数的返回值是一个地址(j的地 址),所以该函数是一个指针类型。 退出时该函数中的变量全部释放。i=99,j=101,*p=101 习题一.选择题 8.1 若有定义:int x,*pb;则正确的赋值表达式是 A pb= 程序的输出结果是 A 因变量无定义输出不定值 B 0 C -1 D 1 8.3 若有以下程序: #include void sub(int x,int y,int
13、*z) *z=y-x; main() int a,b,c;sub(10,5, sub(7,a, sub(a,b,printf(“%d,%d,%dn“,a,b,c); 程序的输出结果是 A 5,2,3 B -5,-12,-7 C -5,-12,-17 D 5,-2,-7ABB习题8.4 若有以下程序: #include main() int k=2,m=4,n=6,*pk=*(p= printf(“%dn“,n); 程序的输出结果是 A 4 B 6 C 8 D 10 8.5 若指针p已正确定义并指向如图所示存储单元: 则执行语句*p+; 后,*p的值是 A 20 B 30 C 21 D 31 8
14、.6 若指针p已正确定义并指向如图所示存储单元,则*+p的值是 A 20 B 30 C 21 D 31 8.7 若指针p已正确定义并指向如图所示存储单元,则+*p的值是 A 20 B 30 C 21 D 31a0 a1 a2 a3 a410 20 30 40 50pCBBC习题8.8 若有以下程序: #include void prtv(int *x) printf(“%dn“,+*x); main() int a=25;prtv( 程序的输出结果是 A 23 B 24 C 25 D 26 8.9 若有以下程序 #include main() int *k,*a,b=100;a=k=printf(“%dn“,*k); 程序的输出结果是 A 运行错误 B 100 C a的地址 D b的地址DB习题8.10 若有以下程序: #include void fun(float