1、指针1第九章第九章 指针指针指针与指针变量指针与函数指针与数组指针数组29.1 指针与指针变量一一基本概念基本概念q 指针是一种数据类型指针是一种数据类型整数型整数型 int 基本类型基本类型实数型实数型 float,double字符型字符型 char 指针类型指针类型数据类型数据类型数组型数组型 构造类型构造类型结构型结构型 struct联合型联合型 union枚举型枚举型 enum 空类型空类型 void数据结构、表示范围、存储分配数据结构、表示范围、存储分配39.1 指针与指针变量q 指针是一个地址指针是一个地址是是变量变量在内存中所在内存中所对应存储单元的对应存储单元的地址地址变量变量
2、的四个属性的四个属性n 变量变量名称名称n 变量变量数据类型数据类型n 变量变量值值n 变量变量地址地址char c=a;?49.1 指针与指针变量变量的变量的地址地址n多数现代计算机用字节多数现代计算机用字节(byte)来分割内存,每来分割内存,每个字节可以存储个字节可以存储8位位(bit)信息;信息;n每个字节都有唯一的地每个字节都有唯一的地址址(address) 。010001110110111101101111011001000100001101000011n-1地址地址内容内容59.1 指针与指针变量n程序运行时,要将变量的程序运行时,要将变量的值值保存在计算机的保存在计算机的存储单
3、元中,每个变量占有一个或多个内存存储单元中,每个变量占有一个或多个内存字节,把字节,把第一个字节第一个字节的地址称为变量的地址。的地址称为变量的地址。1000char c=a;变量变量c地址为地址为1000float f=1.6;变量变量f地址为地址为200020002001变量变量f变量变量ca2002200369.1 指针与指针变量q 指针变量是存放地址的变量指针变量是存放地址的变量n指针变量指针变量pc是是char型指针型指针;它的值为;它的值为1000H,即变量即变量c的地址,或称指针变量的地址,或称指针变量pc指向变量指向变量c;pc拥有自己的内存地址。拥有自己的内存地址。1000H
4、char c;变量变量ca1001H1000H变量变量pc3000Hchar * pc;pc = &c;c = a;79.1 指针与指针变量mark0mark1mark2mark3.mark9986.592.077.552.0.94.02000H2004H2008H200CH.218CHfloat mark100float mark100;p=mark;p=&mark0;n 指针变量指针变量p是是float型型指针指针;它的值为;它的值为2000H,即数组,即数组mark的首地址,也是元素的首地址,也是元素(变量变量)mark0的地址的地址float *p;等等价价89.1 指针与指针变量 指
5、针变量与地址常量指针变量与地址常量int a3=1,2,3,b,*p;p=a;scanf(“%d”,&b);p=&b;la是数组名,是数组的首地址,是一个地址常是数组名,是数组的首地址,是一个地址常量;量;&b是取是取b的地址,也是地址常量;的地址,也是地址常量;lp是一个指针变量,它可以用来存放地址是一个指针变量,它可以用来存放地址它是一个容器。它是一个容器。99.1 指针与指针变量小结小结q 指针指针:变量的地址:变量的地址q 一般变量一般变量:存储变量的值:存储变量的值q 指针变量指针变量:存储变量地址:存储变量地址q 请注意指针变量与地址常量的区别请注意指针变量与地址常量的区别109.
6、1 指针与指针变量二二指针变量的定义与赋初值指针变量的定义与赋初值 数据类型数据类型 * 指针变量名指针变量名 =初值初值 ;例如:例如:int a,*pa; pa=&a;指针的类型,是指针的类型,是指针所指的变量指针所指的变量的类型的类型*为指针说明符,说明后为指针说明符,说明后面的标识符为指针变量面的标识符为指针变量(它也是它也是间接访问符间接访问符)指针变量是变量,要先定指针变量是变量,要先定义,再赋值,再使用!义,再赋值,再使用!119.1 指针与指针变量q为指针变量赋初值为指针变量赋初值n使用赋值语句使用赋值语句int a, * pa; /* * 说明变量说明变量a和指针变量和指针变
7、量pa * */pa=&a; /* * 将变量将变量a的地址赋给指针的地址赋给指针pa * */n变量说明同时赋初值变量说明同时赋初值 int a, * pa=&a;12三三引用指针变量引用指针变量l&取地址运算符取地址运算符l*指针内容运算符指针内容运算符(间接存取运算符间接存取运算符)int x=10, * p, y;p=&x; /* * 取变量取变量x的地址赋给指针变量的地址赋给指针变量p * */y=*p; /* * 取指针变量取指针变量p所指所指单元单元的内容赋给变量的内容赋给变量y * */有类型说明符的作用有类型说明符的作用运算符运算符p自动取两个自动取两个(或或4个个)字节的内
8、容给字节的内容给y139.1 指针与指针变量变量的两种访问方式变量的两种访问方式直接访问直接访问:通过变量名访问该变量通过变量名访问该变量。间接访问间接访问:通过指针变量中存放的地址访问该变量通过指针变量中存放的地址访问该变量。int a=10;printf(“%dn”,a); /*通过访问变量通过访问变量a,输出输出a的值的值*/int a=10,*p=&a;printf(“%dn”,*p); /*通过通过p间接访问间接访问a并输出并输出a值值*/149.1 指针与指针变量v 练习:已知练习:已知int a,*p=&a; 若给若给a赋值或输赋值或输出,下面语句正确的是:出,下面语句正确的是:
9、A) scanf(“%d”,a);B) scanf(“%d”,p);C) scanf(“%d”,&a);D) printf(“%d”,a);E) printf(“%d”,p);F) printf(“%d”,*p);159.1 指针与指针变量 例:例:已知:已知:int x=2, y, *px; x为一般变量,为一般变量,px为指针型变量为指针型变量px px=&x; *px=10;x210 x = 10; *px *(&x) x169.1 指针与指针变量 y=x * 100; *px=y*10; +x; x+; pxx210 y = *px; y = *px * 100; x = y * 10
10、; + * px; (* px)+; 括号不能省略括号不能省略 y=x; 17 基本运算辨析基本运算辨析int x=10, y=5, *p=&x, *q=&y;px210qy25p = q;为指针为指针p赋值,使赋值,使p和指针和指针q指向同一单元指向同一单元qy25p*p = *q; 为指针为指针p的内容赋值,使的内容赋值,使*p和和*q的值相同的值相同qy25px2105189.1 指针与指针变量u 思考:哪些是正确的?思考:哪些是正确的?int a=1,*pa;*pa=a;int a=1,*pa=&a;int a=1,*pa;pa=&a;指针变量是变量,要先赋值,再使用!指针变量是变量,
11、要先赋值,再使用! int a=1,*pa;*pa=&a; 199.1 指针与指针变量指针可以指向所有类型的数据指针可以指向所有类型的数据q指针指向指针指向变量变量-变量的指针变量的指针(存变量的地址存变量的地址)q指针指向指针指向数组数组-数组指针数组指针(存数组的起始地址存数组的起始地址)q指针指向指针指向函数函数-函数指针函数指针(存放函数的入口地址存放函数的入口地址)q指针指向指针指向指针指针-指针型指针指针型指针(存放某指针的地址存放某指针的地址)q由指针组成的数组由指针组成的数组-指针数组指针数组q指针指向指针指向结构结构q指针指向指针指向文件文件 指针是定位其它对象的特殊类型的数
12、据。指针是定位其它对象的特殊类型的数据。20第九章第九章 指针指针指针与指针变量指针与函数指针与数组指针数组219.2 指针与函数三个方面:三个方面:q 指针作为函数的参数指针作为函数的参数q 函数返回指针函数返回指针q 指向函数的指针指向函数的指针多用于字符串操作多用于字符串操作229.2 指针与函数一一指针作为函数的参数指针作为函数的参数用指针在函数之间用指针在函数之间“传递传递”地址,做到地址,做到共享存储。共享存储。必须满足:实参和形参应是同类型的指必须满足:实参和形参应是同类型的指针或指针变量。针或指针变量。23 例:交换例:交换int swap (int x, int y) int
13、 t; t=x; x=y; y=t; printf(“swap:x=%d,y=%dn”,x,y); return ; int main( ) int x=2, y=3; printf(“before:x=%d,y=%dn”,x,y); swap (x, y); printf(“after:x=%d,y=%dn”,x,y); 输出:输出:before: x=2,y=3swap:x=3,y=2after:x=2,y=3值传递,主函数中值传递,主函数中x,y值未交换值未交换24用指针完成两数的交换用指针完成两数的交换int swap (int *px, int *py) int t; t=*px;
14、*px=*py; *py=t; printf(“swap:x=%d,y=%dn”,*px,*py); return ; int main( ) int x=2, y=3; printf(“before:x=%d,y=%dn”,x,y); swap (&x, &y); printf(“after:x=%d,y=%dn”,x,y);输出:输出:before:x=2,y=3 swap:x=3,x=2after:x=3,y=2由于指针变量由于指针变量px接受的是接受的是x的地的地址,所以址,所以*px就是就是x。地址传递,主函数中地址传递,主函数中x,y值交换值交换25 数组名、指针、形参、实参数组名
15、、指针、形参、实参q在函数之间传递数组,数组名可以作函数的在函数之间传递数组,数组名可以作函数的实参和形参,指针也可以做函数的实参和形实参和形参,指针也可以做函数的实参和形参,对应关系有以下参,对应关系有以下4种:种:1. 形参和实参都用数组名;形参和实参都用数组名;2. 实参用数组名,形参用指针变量;实参用数组名,形参用指针变量;3. 实参、形参都用指针变量;实参、形参都用指针变量;4. 实参为指针变量,形参为数组名;实参为指针变量,形参为数组名;q在函数之间传递数组,当形参使用指针时,在函数之间传递数组,当形参使用指针时,在被调用函数的内部,就可用指针方式访问在被调用函数的内部,就可用指针
16、方式访问数组中的元素。数组中的元素。26fun(char str ) main() char s10=“abc”; fun(s); fun(char *str) main() char s10=“abc”; fun(s); fun(char str ) main() char a8,*s=a; fun(s);fun(char * str) main() char a8,*s=a; fun(s);279.2 指针与函数一一函数返回指针函数返回指针 即函数的返回值是指针类型,这样的即函数的返回值是指针类型,这样的函数定义形式为:函数定义形式为:类型类型 * 函数名函数名 (形式参数表形式参数表)
17、例如:例如:int * fun (int x) 289.2 指针与函数比较比较返回返回char值:值:char min(char a10) char i,m; m=a0; for(i=1;iai) m=ai; return m; 返回返回char *(char指针指针)值值char *min(char a10) char i,*m; m=&a0; for(i=1;i10;i+) if(*my?x:y;int main( ) int c,a=15,b=12,(*p)( ); p=max; /* p指向函数指向函数max */ c=(*p)(a,b); /* 用指针用指针p调用函数调用函数 */
18、printf(“max=%dn”,c);319.2 指针与函数请区分请区分返回指针的函数返回指针的函数和和指向函数的指指向函数的指针变量针变量:int * func( )int (* func)( );定义了一个返回定义了一个返回指针的函数指针的函数定义了一个指向定义了一个指向函数的指针变量函数的指针变量32第九章第九章 指针指针指针与指针变量指针与函数指针与数组指针数组339.3 指针与数组一一指向数组元素的指针指向数组元素的指针二二指针基本运算指针基本运算q 指针加减一个正整数指针加减一个正整数q 两个指针的关系运算两个指针的关系运算q 两个指针之间的减法运算两个指针之间的减法运算三三指向
19、数组的指针指向数组的指针(数组指针数组指针)四四字符指针与字符数组字符指针与字符数组指针数组指针数组349.3 指针与数组一一指向数组元素的指针指向数组元素的指针q定义定义 int a5,*p=a; p指针的基类型是指针的基类型是int,它可以指向,它可以指向int型数组型数组元素。通过赋初值,元素。通过赋初值,p指向指向a0。a0 a1 . aia.a&a0 数组在内存中占一片连续的存储单元。用数数组在内存中占一片连续的存储单元。用数组名表示该片存储区的首地址。用下标方式引组名表示该片存储区的首地址。用下标方式引用数组元素。用数组元素。35q 用指向数组元素的指针引用一维数组元素用指向数组元
20、素的指针引用一维数组元素int a6=1,2,3,4,5,6,*p=a; a+i &ai 地址地址 *(a+i) ai 内容内容若若 p=a;则则 p+i &ai 地址地址 *(p+i) ai 内容内容 pi *(p+i) ai相对相对p指针当前位置移动指针当前位置移动 i 个个单元单元的内容的内容aa+1a+ia+2.aia1a2aa0.pp+1p+ip+236aa+1a+4a+2a3a1a2aa0pp+1p+2p+3a4pa+3p+2p+1a是常量,是常量,p是变量!是变量!(更灵活更快更灵活更快)pp+p-p-1数组的下标数组的下标引用引用数组的指针引用数组的指针引用数组的数组名引用数组
21、的数组名引用37int a6=1,2,3,4,5,6,*p;p=a; k=*(p+2); h=p2;*p= ? k= ? h= ?133p=a+2; k=*(p+2); h=*(p-2)+p1;*p= ? k= ? h= ?351+4=5p=a; p+=1; k=*p+; h=*+p; (*p)-; *p= ? k= ? h= ?32438q 用指向数组元素的指针引用二维数组元素用指向数组元素的指针引用二维数组元素多维数组元素在内存中线性排列:多维数组元素在内存中线性排列:b00b01b02b10b11b12指针引用指针引用*p*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)指针按
22、下标引用指针按下标引用p0p1p2p3p4p5下标引用下标引用若若p=b0:pi*列数列数+j *(p+i*列数列数+j) bij399.3 指针与数组一一指向数组元素的指针指向数组元素的指针二二指针基本运算指针基本运算q 指针加减一个正整数指针加减一个正整数q 两个指针的关系运算两个指针的关系运算q 两个指针之间的减法运算两个指针之间的减法运算三三指向数组的指针指向数组的指针(数组指针数组指针)四四字符指针与字符数组字符指针与字符数组409.3 指针与数组一一指针基本运算指针基本运算1.指针加减一个正整数指针加减一个正整数int a10,*p;设设 p=&a5;若若 p+; p指向指向 ?
23、若若 p-; p指向指向 ?若若a+;a6a4a=a+1, a 是地址常量,不是地址常量,不能出现在赋值等号左边能出现在赋值等号左边 419.3 指针与数组放大因子放大因子q 由于指针所指的对象不同,在进行加减由于指针所指的对象不同,在进行加减运算时,运算时,C语言会根据所指对象计算出语言会根据所指对象计算出不同的放大因子。不同的放大因子。q 对于对于char,放大因子为,放大因子为 1;对于;对于int,放,放大因子为大因子为 2 或或 4 ;对于;对于long,放大因,放大因子为子为 4;对于;对于double,放大因子为,放大因子为 8。42 例:编写函数,实现字符串复制例:编写函数,实
24、现字符串复制int main( ) char a30, b30; printf(Enter string:); scanf (%s, a); stringcpy ( a, b ); / /* *调用函数的实参为数组名调用函数的实参为数组名* */ / printf (a=%snb=%sn, a, b );stringcpy ( str1, str2 ) / /* *将将串串str1拷贝到串拷贝到串str2中中* */ / char * str1, * str2; / /* *形参为指向字符的指针形参为指向字符的指针* */ / while ( (*str2 = *str1)!=0)/ /* *
25、通过指针操作数组通过指针操作数组* */ / str1+; str2+; 43 对上述复制函数的改进对上述复制函数的改进原循环语句:原循环语句:while ( (*str2 = *str1)!=0) str1+; str2+;改进改进1:while (*str2+ = *str1+)!=0);改进改进2:while (*str2+ = *str1+)449.3 指针与数组2. 两个指针的关系运算两个指针的关系运算 两个指针指向同一数组的元素时才能进行指两个指针指向同一数组的元素时才能进行指针关系运算针关系运算(、=、=、!=、=)。 例如:当指针例如:当指针p和和q指向同一数组中的元素时,指向
26、同一数组中的元素时,则:则:n关系表达式关系表达式“pq”:当:当p所指的元素在所指的元素在q所指的所指的元素之前时,表达式成立;反之,表达式不成立。元素之前时,表达式成立;反之,表达式不成立。n关系表达式关系表达式“p=q”:判断指针:判断指针p和和q是指向同一是指向同一存储单元。当指向同一元素时,表达式成立;反存储单元。当指向同一元素时,表达式成立;反之,表达式不成立。之,表达式不成立。45 基本运算辨析基本运算辨析int x=10, y=5, *p=&x, *q=&y;p = q判断判断 指针指针p 和指针和指针q 是否指向同一单元是否指向同一单元*p = *q判断判断 指针指针p 和指
27、针和指针q 的内容是否相同的内容是否相同46l 空指针空指针 NULLlNULL 具有特殊的含义:表示指针没有指向任具有特殊的含义:表示指针没有指向任何对象;何对象;l任何指针任何指针p与与NULL进行进行“p=NULL”或或“p!=NULL”运算均有意义:判断指针运算均有意义:判断指针 p 是否是否指向空;指向空;l使用使用NULL时要时要include 。lvoid型指针型指针 无指定类型的指针无指定类型的指针(通用型指针通用型指针)47申请及释放内存函数申请及释放内存函数 (malloc、free)void * malloc ( unsigned size )功能:申请长度为功能:申请长
28、度为size字节的内存区。申请成功,函字节的内存区。申请成功,函数返回所分配的内存区首字节的地址,即指向数返回所分配的内存区首字节的地址,即指向该内存的指针;申请失败,函数返回该内存的指针;申请失败,函数返回NULL。void free ( void * p )功能:释放功能:释放p所指的内存空间。所指的内存空间。举例:举例: int * p;p = malloc( 10 * sizeof(int) );free(p);(int *)malloc的返回值为的返回值为void型指针,型指针,是通用指针类型,在实际申请内是通用指针类型,在实际申请内存时,要进行指针类型强制转换存时,要进行指针类型强
29、制转换489.3 指针与数组3. 两个指针之间的减法运算两个指针之间的减法运算n当两个指针指向同一数组中的元素时,才能当两个指针指向同一数组中的元素时,才能进行指针间的减法运算,当两个指针分别指进行指针间的减法运算,当两个指针分别指向不同数组的元素时,无意义。向不同数组的元素时,无意义。n当两个指针指向同一数组中的元素时,当两个指针指向同一数组中的元素时,p-q 的物理意义是:指针的物理意义是:指针p和和q所指对象之间的所指对象之间的元素的数量。元素的数量。499.3 指针与数组 例:编写函数,求字符串的长度。例:编写函数,求字符串的长度。stringlen ( char * s ) /* 求
30、串求串s的长度的长度 */ char *p = s; while ( *p ) p+; /* 找到串结束标记找到串结束标记0 */ return ( p - s ); /*两个指针相减,求出串长两个指针相减,求出串长*/ a b c d e f 0sp =s+6串长串长=6509.3 指针与数组一一指向数组元素的指针指向数组元素的指针二二指针基本运算指针基本运算q 指针加减一个正整数指针加减一个正整数q 两个指针的关系运算两个指针的关系运算q 两个指针之间的减法运算两个指针之间的减法运算三三指向数组的指针指向数组的指针(数组指针数组指针)四四字符指针与字符数组字符指针与字符数组51一一指向数组
31、的指针指向数组的指针1. 回顾二维数组的地址回顾二维数组的地址l 二维数组名二维数组名 b 表示二维数组的首地址表示二维数组的首地址l bi 表示表示i行一维数组的首地址行一维数组的首地址且且有有: : bi+j &bijl b+i表示表示i行首地址行首地址bi的地址的地址b2b0b1bb+1b+2174523952b 二维数组是二维数组是数组的数组数组的数组 *( *(b+i)+j ) bij522. 指向数组的指针指向数组的指针 数据类型数据类型 (*数组名数组名)元素个数元素个数; int b23=1,2,3,11,12,13; int (*p)3; p是指向含有是指向含有3个元素的一维
32、数组的指针,一维个元素的一维数组的指针,一维数组的数组的3个元素分别是个元素分别是(*p)0,(*p)1,(*p)2。若若p=b: (*(p+i)j bij *(*(p+i)+j) bij(*p)0 (*p)1 (*p)2pp+153比较比较指向数组元素的指针:指向数组元素的指针:int a3,*pa=a;pa a &a0指向数组元素的指针指向数组元素的指针仍是仍是指向变量的指针指向变量的指针指向一维数组的指针:指向一维数组的指针:int b23,(*pb)3=b;pb b &b0pb指向的是数组,是指向的是数组,是长度为长度为3的整型数组的整型数组a0b00b10apabpbb0pa和和a是
33、一个是一个级别的指针级别的指针pb和和b是一个是一个级别的指针级别的指针549.3 指针与数组3. 对二维数组元素的引用对二维数组元素的引用l用指向数组元素的指针引用二维数组用指向数组元素的指针引用二维数组元素元素l用指向数组的指针引用二维数组元素用指向数组的指针引用二维数组元素559.3 指针与数组b00b01b02b10b11b12指向数组元指向数组元素的指针素的指针pb*pb*(pb+1)*(pb+2)*(pb+3)*(pb+4)*(pb+5)指向数组的指针指向数组的指针p(*p)0*p(*p)1*(*p+1)(*p)2*(*p+2)(*(p+1)0*(p+1)(*(p+1)1*(*(p
34、+1)+1)(*(p+1)2*(*(p+1)+2)下标引用下标引用int b23, *pb=b0, (*p)3=b;56l 用指向数组的指针访问二维数组用指向数组的指针访问二维数组int main( ) int b23=1,2,3,4,5,6,(*p)3=b,i,j; for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d”, ); printf(“n”); *(*(p+i)+j)bijpij(*(p+i)j57l 用指向数组元素的指针引用二维数组元素用指向数组元素的指针引用二维数组元素int main( ) int b23=1,2,3,4,5,6,*p=b0,i;
35、 for(i=0; i6; i+) printf(“%4d”, ); if(i+1)%3=0) printf(“n” ); p是指向数组是指向数组元素的指针元素的指针*p+pi58指针与数组小结指针与数组小结l数组名数组名 int a3, b23;*(a+i) ai; *(*(b+i)+j) bij;l指向数组元素的指针指向数组元素的指针 int *p; p=a(或或=&a0); p=b0(或或=&b00); *(p+i) ai; *(p+i*3+j) bij;l指向数组的指针指向数组的指针 int (*p)3; p=b(或或=&b0); (*(p+i)j bij;599.3 指针与数组 in
36、t a3;int *pa;pa=a;a:一级地址常量一级地址常量pa:一级指针变量一级指针变量int b23;int (*pb)3;pb=b;b:二级地址常量二级地址常量pb:“二级二级”指针变量指针变量 请区分请区分 指向数组元素的指针指向数组元素的指针 和和指向数组的指针!指向数组的指针!60第九章第九章 指针指针指针与指针变量指针与函数指针与数组指针数组619.4 指针数组一一指针数组指针数组 数组中的元素均为指针类型,称之为指数组中的元素均为指针类型,称之为指针数组。针数组。指针数组说明的形式为:指针数组说明的形式为:数据类型数据类型 * 数组名数组名常量表达式常量表达式例如:例如:
37、int * p6; 含义:定义一个由含义:定义一个由 6个个 指针变量构成的指针数指针变量构成的指针数组,数组中的每个数组元素组,数组中的每个数组元素指针,都指向一指针,都指向一个整数。个整数。62比较比较指针数组:指针数组:int *p3;数组数组p中的每一个元素中的每一个元素都是指向都是指向int的指针变量的指针变量数组指针:数组指针:int (*pb)3;pb指向长度为指向长度为3的整型的整型数组数组p0p1p2intintintintintint(*pb)0(*pb)1(*pb)2pb63 例:例: w_day表用指针数组实现。表用指针数组实现。char * w_day8=Sunday
38、,Monday,Tuesday,Wednesday, Thursday,Friday,Saturday,NULL;Sunday0Monday0Tuesday0Friday0Thursday0Saturday0Wednesday0数组数组w_dayw_day0w_day1w_day2w_day3w_day4w_day5w_day6w_day7NULL64 用指针数组实现输入字符串查找是星期几。用指针数组实现输入字符串查找是星期几。#include char * w_day8= Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturd
39、ay, NULL;int main( ) int h; char string20; printf(Enter a string: ); scanf(%s, string); h = lookup ( string ); printf (h=%dn, h);lookup( char ch ) /*传递字符串传递字符串(字符数组字符数组)*/ int i, j; for ( i=0; w_dayi!=NULL; i+ ) /*完成查找工作完成查找工作*/ if ( strcmp(w_dayi,ch)=0) return i; /* 找到找到 */ return -1; /* 若没有找到,则返回若
40、没有找到,则返回-1 */659.4 指针数组int main() char *p =one,two,three int i; for(i=0;itest a1 b2 c3 argv1argv0argv2 argv367例:例:/*本程序运行文件名为本程序运行文件名为test1.exe */int main (int argc, char *argv ) int i; printf(“argc=%dn”,argc); for(i=0; iargc; i+) printf(“%sn”,argvi); /*输出命令行参数输出命令行参数*/命令行输入:命令行输入: test1 IBM-PC COMP
41、UTER输出:输出: argc=3 test1 IBM-PC COMPUTER68有关指针的数据类型和指针运算小结int * p;int * q3;int (* w)3;int * g( ) int (* y)( );p 是一个指向整型数据的指针变量是一个指向整型数据的指针变量根据优先级,根据优先级,q先和先和 结合,所以结合,所以 q 是一是一个指针数组,该数组有个指针数组,该数组有3个元素。个元素。( )内的内的*w指示出指示出w是一个指针,指向一个是一个指针,指向一个含含3个元素的一维数组。个元素的一维数组。w是数组指针。是数组指针。根据优先级,根据优先级,g先和先和( )结合,所以结合
42、,所以 g 是一是一个函数,个函数,*说明函数的返回值是指向整型说明函数的返回值是指向整型数据的指针。数据的指针。(*y)说明说明y是一个指针,是一个指针,( )表明此指针是表明此指针是指向函数的,函数的返回值是整型。指向函数的,函数的返回值是整型。int x;x是一个整型变量是一个整型变量69第十章 指针v说明语句说明语句“int *(*p)( );”的含义是:的含义是:A. p是一个指向是一个指向int型数组的指针型数组的指针B. p是指针变量,它构成了指针数组是指针变量,它构成了指针数组C. p是一个指向函数的指针,该函数是一个指向函数的指针,该函数的返回值是一个整型的返回值是一个整型D
43、. p是一个指向函数的指针,该函数是一个指向函数的指针,该函数的返回值是一个指向整型的指针的返回值是一个指向整型的指针70v 练习练习int b23=1,2,3,4,5,6,*p,(*pb)3;p=&b00;pb=b;*(p+1)=?*(pb+1)=?*(*(pb+1)=?能够对能够对“5”进行引用的是:进行引用的是:*(p+4), b11, p11,*(*(pb+1)+1), pb111652432b1ppbp+1pb+14711.已知:已知:int a, *p=&a; 以下对变量以下对变量a的引用错的引用错误的是:误的是:A. *&pB. *pC. p0D. *&a2.定义定义char *
44、str =“12345”, “abcde”;以下以下正确的叙述是:正确的叙述是:A. str是一个指向长度为是一个指向长度为2的数组的指针的数组的指针B. str是一个指针数组,两个元素分别是字是一个指针数组,两个元素分别是字符串符串“12345”和和“abcde”的首地址的首地址C. str的两个元素分别是长度为的两个元素分别是长度为5的一维字符的一维字符数组数组D. str的两个元素的值分别是的两个元素的值分别是“12345”和和“abcde”72第十章 指针3.已知:已知:int b43=1,2,3,4,5,6,7,8,9,10,11,12;int *p, (*ptr)3;现有现有p=b0; ptr=b;以下不能正确表示数组元素以下不能正确表示数组元素b12的是:的是:A. *(*(ptr+1)+2)B. *(ptr+1)2 C. *(p+5)D. (*(b+1)273第十章 指针4.int main(argc, argv)中形式参数中形式参数argv的正确说明形式应当为的正确说明形式应当为: A) char *argv B) char argv C) char argv D) char *argv
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。