第十章 指 针
学习目的与要求:1,理解地址和指针的概念。
2,重点掌握指针变量的定义和引用。
3,重点掌握指向数组的指针和通过指向数组的指针操纵数组。
4,重点掌握指向字符串的指针和通过指向字符串的指针操纵字
符串。
5,理解指向指针的指针、指针数组等概念。
重点,1,指针变量的定义和引用。
2,指向数组的指针和通过指向数组的指针操纵数组。
3,指向字符串的指针和通过指向字符串的指针操纵字符串。
第1讲
知识归纳
1,地址和指针的概念
(1) 地址:内存区的每一个字节的编号。
(2) 指针:一个变量的地址称为该变量的指针,即地址就是指针,指针就是地址。
2,指向变量的指针变量
(1) 指针变量:是指专门用来存放变量地址的一类变量。
(2) 注意区分指针和指针变量的概念。
指针是地址;指针变量是存放地址的变量。
平时所说的定义一个指针,实际上是指定义一个指针变量。
3,指针变量的定义和引用
(1) 定义指针变量格式,基类型 * 指针变量名 ;
(2) 如何确定指针变量的类型:要定义的指针准备指向什么类型变量,该指针就是什么类型;
(3) 如何将一个指针指向一个变量:将变量的地址赋值给指针变量;
&—取地址运算符;
如:int a =5 ;
int * pa ;
int pa = &a ;
(4) 指针变量的引用,
第二部分 C语言程序设计同步训练
·231·
·231·
*—取内容运算符,该运算符与指针变量结合,表示指针所指向的变量的内容;
int a=5
int *pa;
int pa=&a;
如:printf (,% d,%d\n,,* pa,a ) ;
下面是错误的,
int * pa ;
printf (,% d \n,,* pa ) ;
//一个指针在没有指向一个确切的存储空间时,是不能使用 * pa
4,指针总结
int a = 5 ;
int * pa =&a ;
在定义指针并指向某个变量后,我们可以得出如下结论。
(1) *pa 等价于 a
(2) pa 等价于 &a
(3) & * pa 等价于 &a,pa
(4) * &a 等价于 a
基础训练(A)
一、选择题
1,已知:int *p,a;则语句“p=&a;”中的运算符“&”的含义是( )。
A) 位与运算 B) 逻辑与运算 C) 取指针内容 D) 取变量地址
2,已知:double d;希望指针变量pd指向d,下面对指针变量pd的正确定义是 ( )。
A) double pd; B) double &pd C) double *pd D) double *(pd)
3,若x为整型变量,p是指向整型数g6466的指针变量,则正确的赋值表g17810式是( )。
A)p=&x B)p=x C)*p=&x D)*p=*x
g1120、g3647空题
1,要使指针变量与变量g1055间g5326g12447g13864g13007,可以用运算符 来定义一个指针变量,用运算符 来g5326g12447指针变量与变量g1055间的g13864g13007。
2,已知:int a=10,*p=&a;则“printf("%d,%d\n",a,*p);”的g17767出结g7536是 。
3,已知:float f1=3.2,f2,*pf1=&f1;g10628在希望变量 f2 的值为 3.2,可使用赋值语句
g6122 。
4,已知:int b=5,*p=&b;并g1000 b 的地址为 4000,则“printf("%d,%d",p,*p);”的g17767出结g7536
是 。
g989、g19417g16847g12255g5219,g3250g12584g19394题。
1,main()
{ int var,*p;
var=100; p=&var;
C语言程序设计上机指导与同步训练
·232·
·232·
var=*p+10;
printf("%d",var);
}
运g15904结g7536:_____________________。
2,
#include <stdio.h>
void prtv(int *x)
{ printf("%d\n",++*x);
}
main()
{ int a=25;
prtv(&a);
}
运g15904结g7536:_______________________。
能力提高(B)
一、选择题
1,已知:int a,*p=&a;则下g2027g2001数g16855用中错误的是( )。
A)scanf("%d",&a); B)scanf("%d",p);
C)printf("%d",a); D)printf("%d",p);
2,已知:int i=0,j=1,*p=&i,*q=&j;错误的语句是( )。
A) i=*&j; B) p=&*&i; C)j=*p; D)i=*&q;
3,g2001数的g2163能是g1144g6454变量x和y中的值,g1000g17902g17819正确g16855用g17832g3250g1144g6454的结g7536。能正确g6203
g15904g8504g2163能的g2001数是( )。
A) funa(int *x,int *y)
{ int *p;
*p=x; *x=*y; *y=*p;
}
B) funb(int x,int y)
{ int t;
t=x; x=y; y=t;
}
C) func(int *x,int *y)
{ *x=*y; *y=*x;
}
D) fund(int *x,int *y)
{ int t;
t=*x; *x=*y; *y=t;
}
g1120、g19417g16847g12255g5219g1901出运g15904结g7536
1,# include <stdio.h>
viod swap (int,int)
main()
第二部分 C语言程序设计同步训练
·233·
·233·
{ int a,b;
a=5;b=10;
printf("before swap a=%d,b=%d\n",a,b);
swap(a,b);
printf("after swap a=%d,b=%d\n",a,b);
}
swap(int x,int y)
{ int temp;
temp=x; x=y; y=temp;
printf("in swap x=%d,y=%d\n",x,y);
}
运g15904结g7536:____________________。
2,# include <stdio.h>
void swap(int,int);
main()
{ int a,b;
a=5;b=10;
printf("before swap a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("after swap a=%d,b=%d\n",a,b);
}
swap(int *px,int *py)
{ int temp;
temp=*px; *px=*py; *py=temp;
printf("in swap x=%d,y=%d\n",*px,*py);
}
运g15904结g7536:_____________________。
g8616g17751上面g1016个g12255g5219,g16809说g7138g1016g13785的区g2047g731
第2讲
知识归纳
1,指针变量做实参
(1) 指针变量g1582实g2454,实g17148g1268的是指针所指向的变量的地址即g1268地址g16855用。
(2) 指针变量g1582实g2454,g5430g2454g5529g20047是指针,即g17902g17819g5430g2454指针g6817g13449g1039g16855g2001数中的变量。
2,指向数组的指针变量
(1) 定义一个指向数g13464g1815g13044的指针变量的g7053g8873,与定义指向变量的指针变量g11468g2528。
(2) 使指针指向数g13464g20330地址:将数g13464名赋值给已定义的指针变量。
使指针指向数g13464的某一g1815g13044:将数g13464g1815g13044地址赋值给已定义的指针变量。
如:int arr[ 10 ];
int * p ; //定义指针变量,类型与将要指向的数g13464类型一g14280;
C语言程序设计上机指导与同步训练
·234·
·234·
p = arr ; //p 指针指向 arr数g13464的g20330地址;等价于 p = & arr[0];
p = &a [ 9] ; // p 指针指向 arr数g13464的g7380后一个g1815g13044arr[9] ;
3,通过指针引用数组元素
int arr[ 10 ];
int * p = arr ;
在定义指针,并指向某个数g13464的g20330地址后,我们可以得出如下结论,
p + i =arr + i = &arr[ i ],g3355表示 arr数g13464的g12544 i 个g1815g13044的地址 ;
指针变量g21641,即在指针g5415g2081所指向的g1815g13044的地址基g11796上+ 一个数g13464g1815g13044的字节数 ;
即 p + i*d //d是一个数g13464g1815g13044的字节数;
*(p+i) = *(arr + i) = arr[i],g3355表示 arr 数g13464的g12544 i 个g1815g13044;
(3) 数g13464g1815g13044的g1016g12193表示g7053g8873,
下g7643g8873,arr[ i ],p [ i ] // g3355表示arr数g13464的g12544 i 个g1815g13044;
指针g8873,* ( p+i),* (arr+i) //g3355表示arr数g13464的g12544 i 个g1815g13044;
4,在使用指向数组的指针变量时,应注意的问题
int arr[ 10 ];
int * p = arr ;
在定义指针,并指向某个数g13464的g20330地址后,
(1) p ++ ; 正确 ;g1306 arr++ ; 不正确 ;
g3252为 arr 表示数g13464名,是g5132量,不能g6203g15904 arr = arr + 1 ;
(2) 要注意 指针变量的g5415g2081值;
(3) ( * p ) ++ —表示p所指向的g1815g13044值g21641;即 arr [ 0] ++ ;
* p ++,* ( p ++ ) —g1820取指针所指向空间的内容,即 arr[0],g9994后指针pa 下g12239一个存储空间,指向 arr[1] ;
(4) * ++pa —指针pa g1820下g12239一个存储空间,g9994后取指针所指向空间的内容。
基础训练(A)
一、选择题
1,已知:int a[10],*p=a;则下面说g8873不正确的是 ( )。
A) p指向数g13464g1815g13044a[0]
B) 数g13464名a 表示数g13464中g12544一个g1815g13044的地址
C) int a[10],*p=&a[0];与上g17860语句等价
D) 以上g3355不对
2,已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示数g13464 a 中g1815g13044的表g17810式是
( )。
A)*p B)a[10] C)*a D)a[p-a]
第二部分 C语言程序设计同步训练
·235·
·235·
g1120、g3647空题
1,在 C 语g16340中,指针变量的值g3698 1,表示指针变量指向下一个,指针变量中g1867g1319g3698g2164的字节数g11013g13007g13491g14270g2172g7693g6466指针变量的 g1927定。
2,已知:int a[5],*p=a;则p指向数g13464g1815g13044a[0],g18039么p+1指向 。若,printf("%d",p);”
的g17767出结g7536是200,g18039么:,printf("%d",p+1);”的g17767出结g7536是 。
3,对数g13464g1815g13044的引用g7053g8873有g1016g12193,和 。g16786 int a[10],*p=a;则对a[3]
的引用可以是 g6122 。
4,在Cg12255g5219中,可以g17902g17819g989g12193运算来g12239g2172指针:,,。
5,g16786有如下定义
int a[5]={0,1,2,3,4},*p1=&a[1],*p2=&a[4];则 p2-p1 的值为 ______,*p2-*p1 的值为 。
g989、g19417g16847g12255g5219g1901出运g15904结g7536
1,main()
{ int a[10],i,*p;
*p=a;
for (i=0; i<10; i++)
scanf("%d",&a[i]);
for (;p<a+10;p++)
printf("%d",*p);
}
g6203g15904g12255g5219,g17767g1849:0 1 2 3 4 5 6 7 8 9
运g15904结g7536:_____________________。
2,main()
{ int a[10],*p;
p=&a[0];
for (;p<a+10;p++)
scanf("%d",p);
p=a;
for (p=a+9; p>=a; p--)
printf("%d",*p);
}
g6203g15904g12255g5219,g17767g1849:0 1 2 3 4 5 6 7 8 9
运g15904结g7536:______________________。
能力提高(B)
一、选择题
1,已知:int a[]={1,2,3,4},y,*p=&a[1];则g6203g15904语句"y=*p++;"g1055后,变量y的值为 ( )。
A) 3 B) 2 C) 1 D) 4
2,已知:int a[]={1,2,3,4},y,*p=&a[0];则g6203g15904语句"y=++(*p);"g1055后,下面( )g1815g13044的值
g2469g10995g1114变g2282。
A) a[0] B) a[1] C) a[2] D)g18129没g2469g10995变g2282
C语言程序设计上机指导与同步训练
·236·
·236·
3,已知:int x[]={1,3,5,7,9,11},*ptr=x;则能g3827正确引用数g13464g1815g13044的语句是 ( )。
A) x B) *(ptr--) C) x[6] D) *(--ptr)
4,若有以下语句并g10000<=k<6,则正确表示数g13464g1815g13044地址的语句是( )。
int x[]={1,3,5,7,9,11},*ptr=x,k;
A) x++ B) &ptr C) &ptr[k] D) &(x+1)
5,已知:int a[]={1,2,3,4,5,6},*p=a;则值为3的表g17810式是 ( )。
A) p+=2,*(p++) B) p+=2,*++p C) p+=3,*p++ D) p+=2,++*p
6,若g12544一个printf语句的g17767出为194,则g12544g1120个printf语句的g17767出为( )。
int a[10],*p=a;
printf("%x",p);
printf("%x",p+9);
A) 203 B) 212 C) 1a6 D) 19d
g1120、g19417g16847g12255g5219g1901出运g15904结g7536
1,# include <stdio.h>
main()
{ int a[]={1,2,3,4,5};
int x,y,*p;
p=&a[0];
x=*(p+2);
y=*(p+4);
printf("*p=%d,x=%d,y=%d\n",*p,x,y);
}
运g15904结g7536:_______________________。
2,#include <stdio.h>
main()
{ int a[]={1,2,3,4,5,6};
int *p;
p=a;
printf("%d,",*p);
printf("%d,",*(++p));
printf("%d,",*++p);
printf("%d,",*(p--));
p+=3;
printf("%d,%d\n",*p,*(a+3));
}
运g15904结g7536:_________________________。
g989、g12255g5219g3647空
1,下面的g12255g5219实g10628g118610个数中g6226出g7380g3835值和g7380g4579值。
void input (int*,int);
void output(int*,int);
int max,min;
find_max_min(int *p,int n)
第二部分 C语言程序设计同步训练
·237·
·237·
{ int *q;
max=min=*p;
for (q= ; ; q++)
if ( ) max=*q;
else if ( ) min=*q;
}
main()
{ int i,num[10];
printf("input 10 numbers:\n");
for (i=0; i<10; i++)
scanf (%d",&num[i]);
find_max_min(num,10);
printf("max=%d,min=%d\n",max,min);
}
g3247、编g12255题
1,编g1901g1016个g2001数,分g2047g4448g6116一g13512数g13464的g17767g1849和g17767出。
void input(int*,int);
void output(int*,int);
main()
{ int a[10];
input(a,10);
output(a,10);
}
void input(int *p,int n)
{
}
void output(int *p,int n)
{
}
第3讲
知识归纳
1,数组、指针和函数的结合应用
传值调用 传地址调用
实参类型 变量名 变量地址 数组名 数组名或数组元素地址
要求形参的类型 变量名 指针 数组 指针
传递的信息 变量的值 变量的地址 数组的起始地址 数组的起始地址或数组元素地址
通过函数调用能否改变实参的值
不能
能 能 能
C语言程序设计上机指导与同步训练
·238·
·238·
2,二维数组的地址问题
int a [3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12} ;
int * p = a ;
(1) a—表示数g13464的g20330地址 ; 等价于 *( a + 0 ),* a
(2) a [ i ] —表示数g13464的g12544 ig15904的g15904地址,即 g12544 ig15904g12544一个g1815g13044的地址;
等价于 *( a + i ),* ( p + i );
(3) &a [ i ][ j ] —表示数g13464的g12544 ig15904 j g2027g1815g13044的地址; 等价于 *( a + i ) +j
和 *( p + i ) +j;
(4) a [ i ][ j ]—表示数g13464的g12544 ig15904 j g2027g1815g13044;等价于 * ( *( a + i ) +j ) ;
和 * ( *( p + i ) +j ) ;
3,指向二维数组的行指针
int a [3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12} ;
int ( * p )[4 ] = a ;
(1) int ( * p )[4 ] = a ;
表示 p 是一个指向g1120g13512数g13464(一g15904有g3247个g1815g13044的)g15904地址的g15904指针;
(2) p + 1 ; g15904指针g2164 1,是g2164 一g15904g1815g13044的字节数的和;
p = p + 1 ; g15904指针g1186g5415g2081g15904指向下一g15904;
基础训练(A)
一、选择题
1,已知:int a[3][4],*p=a;则p表示 ( )。
A) 数g13464a的0g159040g2027g1815g13044 B) 数g13464a的0g159040的地址
C) 数g13464a的0g15904g20330地址 D) 以上g3355不对
2,已知:int a[3][4],*p;若要指针变量p指向a[0][0],正确的表示g7053g8873是 ( )。
A) p=a B) p=*a C) p=**a D) p=a[0][0]
3,已知:double b[2][3],*p=b;下面g2750个不能表示数g13464b的0g159040g2027g1815g13044 ( )。
A) b[0][0] B) **p C) *p[0] D) *p
4,g16786有说g7138int (*ptr)[M];g1866中的g7643g16794符ptr是 ( )。
A) M个指向整型变量的指针
B) 指向M个整型变量的g2001数指针
C) 一个指向M个整型g1815g13044的一g13512数g13464的指针
D) g1867有M个指针g1815g13044的一g13512指针数g13464,每个g1815g13044g18129g2494能指向整型变量
g1120、g3647空题
1,已知:下面g12255g5219g8585中g12544一个 printf 语句的g17767出是 200,则g12544g1120个 printf 语句的g17767出是,g12544g989个printf语句g17767出是 。
int a[3][4],*p=a;
printf("%d",a);
printf("%d",p);
第二部分 C语言程序设计同步训练
·239·
·239·
printf("%d",p+1);
2,已知;int a[2][3]={1,2,3,4,5,6},*p=&a[0][0];则表示g1815g13044a[0][0]的g7053g8873有指针g8873:,
数g13464名g8873:,*(p+1)的值为 。
g989、g19417g16847g12255g5219g1901出运g15904结g7536
1,main()
{ int a[2][3]={0,1,2,3,4,5},*p1,*p2;
p1=a; p2=&a[0][0];
printf("%d,%d\n",p1,p2);
printf("%d,%d\n",*p1,*p2);
printf("%d,%d\n",p1+1,p2+1);
printf("%d,%d\n",*(p1+1),*(p2+1));
}
g1563g16786数g13464a的g20330地址为3000,则运g15904结g7536为,
能力提高(B)
一、选择题
1,已知:int i,x[3][4];则不能g6238x[1][1]的值赋给变量i的语句是 ( )。
A) i=*(*(x+1)+1) B) i=x[1][1] C) i=*(*(x+1)) D) i=*(x[1]+1)
2,已知:static int a[2][3]={2,4,6,8,10,12};正确表示数g13464g1815g13044地址的是( )。
A) *(a+1) B) *(a[1]+2) C) a[1]+3 D) a[0][0]
g1120、g19417g16847g12255g5219g1901出运g15904结g7536
1,main()
{ int a[2][3]={{1,2,3},{4,5,6}};
int m,*ptr;
ptr=&a[0][0];
m=(*ptr)*(*(ptr+2))*(*(ptr+4));
printf("%d\n",m);
}
运g15904结g7536:_____________________。
2,main()
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,13};
int (*ptr)[4]; int sum=0,i,j;
ptr=a;
for (i=0;i<3;i++)
for (j=0;j<2;j++)
sum+=*(*(ptr+i)+j);
printf("%d\n",sum);
}
运g15904结g7536:_____________________。
g989、g12255g5219g3647空
1,下面g12255g5219g17902g17819指向整型的指针将数g13464 a[3][4]的内容g6365 3 g15904*4 g2027的格式g17767出,g16843给
C语言程序设计上机指导与同步训练
·240·
·240·
printf()g3647g1849g17878g5415的g2454数,使g1055g17902g17819指针p将数g13464g1815g13044g6365要g8726g17767出。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p=a;
main()
{ int i,j;
for (i=0; i<3; i++ )
for (j=0; j<4; j++ )
printf("%4d",);
}
第4讲
知识归纳
1,指向字符串的指针变量
(1) 定义指向字符g1030的指针,
char * 指针名 = 字符g1030 ;
如 char * ps =,I am a teacher,” ;
//g17837g18336是将字符g1030的g20330地址存放在字符指针中,g13792不是将字符g1030中的字符存g1849指针。
(2) g8616g17751,
char * ps =,I am a teacher,” ; √
分g5332:char *ps ;
ps =,I am a teacher,” ; √
//g3252为可以将字符g1030的g20330地址存放在指针中;
char s [ 20 ] =,I am a teacher,” ; √
分g5332,char s [20 ] ;
s =,I am a teacher,” ; ×
//g3252为 s 表示字符数g13464的g20330地址,是g5132量,不能在赋值号的g5050g12483,g13792g1000不能将字符g1030
的g20330地址赋值给数g13464名。
(3) g1889g8616g17751,
char s [20] ;
scanf (,%s”,s ) ; √
变g6454:char * ps ;
scanf (,%s”,ps ) ; ×
// 错在字符指针没有指向g1231何存储空间,不能给g1194g17767g1849字符g1030。
g6925g6116:char s [20],* ps ;
ps = s ;
scanf (,%s”,ps ) ; √
//字符指针在没有指向一个确切的字符数g13464时,不能使用%s格式符,g17767g1849字符g1030。
第二部分 C语言程序设计同步训练
·241·
·241·
2,字符串指针作函数参数
实参 形参
数组名 数组名
数组名 字符指针变量
字符指针变量 字符指针变量
字符指针变量 数组名
基础训练(A)
一、选择题
1,已知:char str[]="OK!";对指针变量ps的说g7138和初始g2282是( )。
A) char ps=str; B) char *ps=str;
C) char ps=&str; D) char *ps=&str;
2,下面不正确的字符g1030赋值g6122赋初值的g7053式是( )。
A) char *str; str="string";
B) char str[7]={'s','t','r','i','n','g'};
C) char str[10]; str="string";
D) char str1[]="string",str2[20]; strcpy(str2,str1);
3,已知:char b[5],*p=b;则正确的赋值语句是 ( )。
A) b="abcd"; B) *b="abcd"; C) p="abcd"; D) *p="abcd"
4,已知:char s[20]="programming",*ps=s;则不能引用字母o的表g17810式是( )。
A) ps+2 B) s[2] C) ps[2] D) ps+=2,*ps
5,下g2027对字符g1030的定义中,错误的是( )。
A) char str[7]="FORTRAN";
B) char str[]="FORTRAN";
C) char *str="FORTRAN";
D) char str[]={'F','O','R','T','R','A','N','\0'};
6,已知:char c[8]="beijing",*s=c; int i;则下面的g17767出语句中,错误的是( )。
A) printf("%s\n",s); B) printf("%s\n",*s);
C) for (i=0; i<7;i++) D) for (i=0; i<7; i++)
printf("%c",c[i]); printf("%c",s[i]);
7,已知:char s1[4]="12"; char *ptr;则g6203g15904下面语句后g17767出为 ( )。
ptr=s1;
printf("%c\n",*(ptr+1));
A) 字符'2' B) 字符'1' C) 字符'2'的地址 D) 不确定
g1120、g19417g16847g12255g5219g1901出运g15904结g7536
1,
# include <stdio.h>
main()
C语言程序设计上机指导与同步训练
·242·
·242·
{ char a[]="language";
char *ptr=a;
while (*ptr!='\0')
{ printf("%c",*ptr);
ptr++;
}
}
运g15904结g7536:_____________________。
2,
#include <stdio.h>
main()
{ char *str="abcde";
printf("%c,",*str);
printf("%c,",*str++);
printf("%c,",*++str);
printf("%c,",(*str)++);
printf("%c\n",++*str);
}
运g15904结g7536:________________________。
能力提高(B)
一、选择题
1,已知:char s[10],*p=s;则在下g2027语句中,错误的语句是 ( )。
A) p=s+5; B) s=p+s; C) s[2]=p[4]; D) *p=s[0];
2,已知:char s[100]; int i=10;则在下g2027引用数g13464g1815g13044的语句中,错误的表示是 ( )。
A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i
3,已知:int i; char *s="a\045+045\'b";g6203g15904语句“for ( i=0; *s++; i++) ;”g1055后,变量i的结
g7536是( )。
A) 7 B) 8 C) 9 D) 以上g3355是错误的
4,已知:char *s="a\089+089\'b";则g6203g15904语句“for(i=0;*s++; i++);”g1055后,变量i的结g7536是
( )。
A) 7 B) 8 C) 9 D) 1
g1120、g3647空题
1,已知:char *s1="abc\\\"de",*s2="abc\101+101\'de",*s3="abc\089+980\\"; 则语句
“printf("%s\t%s\t%s\n",s1,s2,s3);”的结g7536是 。
2,若:char *s1="China\\\bBeijing\t",*s2="123\078\0x5",*s3="123\087\0xa"; 则语句
“printf("%d,%d,%d\n",strlen(s1),strlen(s2),strlen(s3));”的结g7536是 。
g989、g19417g16847g12255g5219,g1901出运g15904结g7536
1,
#include <stdio.h>
#include <string.h>
第二部分 C语言程序设计同步训练
·243·
·243·
main()
{ char *p1="abc",*p2="ABC",str[50]="xyz";
strcpy(str+2,strcat(p1,p2));
printf("%s\n",str);
}
运g15904结g7536:____________________。
2,
#include <stdio.h>
main()
{ char a[]="Program",*ptr;
for (ptr=a; ptr<a+7; ptr+=2)
putchar (*ptr);
}
运g15904结g7536:____________________。
3,
#include <stdio.h>
main()
{ char a[]="language";
char *ptr=a;
while (*ptr)
{ printf("%c",*ptr-32);
ptr++;
}
}
运g15904结g7536:______________________。
4,以下g12255g5219g8585的g17767出为_______________________ (选g1582)。
static char a[]="Basic";
char *ptr;
for (ptr=a; ptr<a+5; ptr++)
printf("%s\n",ptr);
A) Basic B) c C) B D) Basic
Asic ci a
sic sic s
ic asic I
c Basic c
g3247、g1901出g2001数实g10628的g2163能
1,已知g2001数定义如下,
abcd ( char *s1,char *s2)
{ while (*s2++=*s1++);
}
g2001数abcd的g2163能是 ( ) 。
A) g1030复制 B) g8726g1030长 C) g1030g8616g17751 D) g1030反向
C语言程序设计上机指导与同步训练
·244·
·244·
2,已知g2001数定义如下,
int f(char *s)
{ char *p=s;
while (*p!='\0') p++;
return (p-s);
}
g2001数f的g2163能是 ( )。
A) g1030g8616g17751 B) g8726g1030长 C) g1030复制 D) 以上g3355不对
五、编g12255题
1,g1901一个g2001数,g8726一个字符g1030的长度。在g1039g2001数中g17767g1849字符g1030,并g17767出字符g1030长度,
用指针g8873处理。
第5讲
知识归纳
1,指针数组
(1) 概念:一个数g13464,g1866g1815g13044g3355为指针类型数g6466,称为指针数g13464。
指针数g13464中的每一个g1815g13044g18129g11468g5415于一个指针变量。
(2) 格式:类型名 * 数g13464名 [ g5132量 ];
如,char * str[3 ] ={,China”,”America”,”Canada”};
//g989个字符g1030的g20330地址依次放g1849 str[0],str[1],str[2] 中。
2,指向指针的指针
(1) 概念:专门用来存放指针变量地址的指针变量,称为指向指针的指针。
(2) 定义格式,int a =5 ;
int * pa = & a ;
int * * pp = &pa ;
printf (,%d,%d,%d \n”,a,*pa,**pp);
所以,a,*pa,**pp等价。
3,指针的总结和综合应用
基础训练(A)
一、选择题
1,已知:double *p[6];它的含义是( )。
A) p是指向duoble型变量的指针 B) p是double型数g13464
C) p是指针数g13464 D) p是数g13464指针
2,已知:char *aa[2]={"abcd","ABCD"};则以下说g8873正确的是( )。
A) aa数g13464g1815g13044的值分g2047是"abcd"和"ABCD"
B) aa是指针变量,它指向含有g1016个数g13464g1815g13044的字符型一g13512数g13464
第二部分 C语言程序设计同步训练
·245·
·245·
C) aa数g13464的g1016个g1815g13044分g2047存放的是含有4个字符的一g13512字符数g13464的g20330地址
D) aa数g13464的g1016个g1815g13044中各g14270存放g1114字符'a'和'A'的地址
3,与定义“int *p[4]”等价的是( )。
A) int p[4] B)int *p C)int *(p[4]) D)int (*p)[4]
g1120、g3647空题
1,对于“int a[4];”可理解为数g13464a有4个g1815g13044,每个g1815g13044g18129是整型数g6466,g18039么,对于“int
*a[4];”的理解就是数g13464a有4个g1815g13044,每个g1815g13044g18129是,又g3252为指针变量可指向与g1866g2528类型的变量,故每个g1815g13044g18129g2494能指向 变量。
2,访g19394变量的g7053式有g1016g12193,和,指向指针的指针采用的是“g1120级间址”g7053g8873。g10628定义一个指向指针数g6466的指针变量,g1866基类型是字符型,。
能力提高(B)
一、g19417g16847g12255g5219g1901出运g15904结g7536
1,
#include <stdio.h>
main()
{ char *name[5],a1[20],a2[20],a3[20],a4[20],a5[20];
int i;
gets(a1);gets(a2);gets(a3);gets(a4);gets(a5);
name[0]=a1;name[1]=a2;name[2]=a3;name[3]=a4;name[4]=a5;
for (i=0; i<5; i++)
printf("%s\n",name[i]);
}
运g15904g12255g5219,g17767g1849:a<CR>ab<CR>abc<CR>abcd<CR>abcde<CR>(<CR>表示g3250车)
运g15904结g7536:_____________________。
2,
#include <stdio.h>
main()
{ char* name[5]={"Follow me","BASIC","Great Wall","FORTRAN","Computer"};
char **p=name;
int i;
for (i=0; i<5; i++)
printf("%s\n",*p++);
}
运g15904结g7536:__________________________。
3,
main()
{ int a[5]={2,4,6,8,10},*p,**k;
p=a;
k=&p;
printf("%d",*p++));
C语言程序设计上机指导与同步训练
·246·
·246·
printf("%d\n",**k);
}
运g15904结g7536:_________________________。
g1120、g12255g5219g3647空(选g1582)
1,下面g12255g5219g4448g6116的g2163能是对一批g12255g5219g16786计语g16340名g1186g4579到g3835进g15904排g5219并g17767出。
#include <string.h>
#include <stdio.h>
sort ( char *book[],int num)
{ int i,j;
char *temp;
for (j=1; j<=num-1; j++ )
for (i=0; ; i++ )
if (strcmp(book[i],book[i+1])>0)
{ temp=book[i];
book[i]=book[i+1];
book[i+1]=temp;
}
}
main()
{ int i;
char * book[]={"FORTRAN","PASCAL","BASIC","COBOL","C",
"Smalltalk"};
sort( );
for ( i=0; i<6; i++ )
printf("%s\n",book[i]);
}
链接二级考试
一、选择题
1,若有以下g16855用语句,则不正确的fung2001数的g20330部是( )。
A) void fun(int m,int x[]) B) void fun(int s,int h[41])
C) void fun(int p,int *s) D) void fun(int n,int a)
main()
{ …
int a[50],n;

fun(n,&a[9]);

}
(2000年4月)
2,g16786已有定义,char *st="how are you"; 下g2027g12255g5219g8585中正确的是( ) 。
A) char a[11],*p; strcpy(p=a+1,&st[4]);
B) char a[11]; strcpy(++a,st);
C) char a[11]; strcpy(a,st);
第二部分 C语言程序设计同步训练
·247·
·247·
D) char a[],*p; strcpy(p=&a[1],st+2);
(2000年4月)
3,有如下说g7138
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表g17810式是( )。
A) *P+9 B) *(P+8) C) *P+=9 D) P+8
(2000年9月)
4,有如下g12255g5219
main()
{ char s[]=”ABCD”,*P;
for(p=s+l; p<s+4; p++) printf (“%s\n”,p);
}
该g12255g5219的g17767出结g7536是( ) 。
A) ABCD B) A C) B D) BCD
BCD B C CD
CD C D D
D D
(2000年9月)
5,有如下g12255g5219
main()
{ char ch[2][5]={“6937”,”8254”},*p[2];
int i,j,s=0;
for(i=0;i<2;i++) p[i]=ch[i];
for(i=0;i<2;i++)
for(j=0;p[i][j]>’\0’;j+=2)
s=10*s+p[i][j]-‘0’;
printf(“%d\n”,s);
}
该g12255g5219的g17767出结g7536是( )。
A) 69825 B) 63825 C) 6385 D) 693825
(2000年9月)
6,下g2027g12255g5219g8585的g17767出结g7536是( ) 。
A) 2 1 4 3 B) 1 2 1 2 C) 1 2 3 4 D) 2 1 1 2
void fun(int *x,int *y)
{ printf(“%d,%d”,*x,*y); *x=3; *y=4;}
main()
{ int x=1,y=2;
fun(&x,&y);
printf(“%d %d”,x,y);
}
(2001年4月)
C语言程序设计上机指导与同步训练
·248·
·248·
7,下g2027g12255g5219的g17767出结g7536是( )。
A) 非g8873 B) a[4]的地址 C) 5 D)3
main()
{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
printf(“%d”,*--p);
}
(2001年4月)
8,下g2027g12255g5219的运g15904结g7536是( )。
A) 6 3 B) 3 6 C) 编译出错 D) 0 0
void fun(int *a,int *b)
{ int *k;
k=a; a=b; b=k;
}
main()
{ int a=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf(“%d %d”,a,b);
}
(2001年4月)
9,下面g12255g5219的g17767出结g7536是( )。
A) 0 B) 1 C) 10 D) 9
main()
{ int a[ ]={1,2,3,4,5,6,7,8,9,0,},*p;
p=a;
printf(“%d\n”,*p+9);
}
(2001年4月)
10,以下g12255g5219的g17767出结g7536是( ) 。
char cchar(char ch)
{
if(ch>=‘A’&&ch<=‘Z') ch=ch-‘A'+‘a';
return ch;
}
main()
{ char s[]="ABC+abc=defDEF",*p=s;
while(*p)
{ *p=cchar(*p);
p++;
}
printf("%s\n",s);
}
A) abc+ABC=DEFdef B) abc+abc=defdef
C) abcaABCDEFdef D) abcabcdefdef
第二部分 C语言程序设计同步训练
·249·
·249·
(2002年4月)
11,以下g12255g5219g16855用findmaxg2001数g17832g3250数g13464中的g7380g3835值( )。
findmax(int *a,int n)
{ int *p,*s;
for(p=a,s=a; p-a<n; p++)
if ( ) s=p;
return(*s);
}
main()
{ int x[5]={12,21,13,6,18};
printf("%d\n",findmax(x,5));
}
在下划线处应g3647g1849的是
A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s
(2002年4月)
12,若有以下定义和语句,
int s[4][5],(*ps)[5];
ps=s;
则对s数g13464g1815g13044的正确引用g5430式是( )。
A) ps+1 B) *(ps+3) C) ps[0][2] D) *(ps+1)+3
(2002年4月)
13,以下g12255g5219的g17767出结g7536是( )。
#include <stdio.h>
#include <string.h>
main()
{ char b1[8]="abcdefg",b2[8],*pb=b1+3;
while (--pb>=b1) strcpy(b2,pb);
printf("%d\n",strlen(b2));
}
A) 8 B) 3 C) 1 D) 7
(2002年4月)
14,若有说g7138:int n=2,*p=&n,*q=p;,则以下非g8873的赋值语句是( )。
A) p=q; B) *p=*q; C) n=*q; D) p=n;
(2002年9月)
15,有以下g12255g5219
void fun(char *c,int d)
{ *c=*c+1;d=d+1;
printf(“%c,%c,”,*c,d);
}
main()
{ char a=’A’,b=’a’;
fun(&b,a); printf(“%c,%c\n”,a,b);
C语言程序设计上机指导与同步训练
·250·
·250·
}
g12255g5219运g15904后的g17767出结g7536是( )。
A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b
(2002年9月)
16,有以下g12255g5219
#include <string.h>
main()
{ char *p=“abcde\Ofghjik\0”;
printf(“%d\n”,strlen(p));
}
g12255g5219运g15904后的g17767出结g7536是( )。
A) 12 B) 15 C) 6 D) 5
(2002年9月)
17,有以下g12255g5219
void ss(char *s,char t)
{ while(*s)
{ if(*s==t) *s=t-‘a’+’A’;
s++;
}
}
main()
{ char str1[100]=“abcddfefdbd”,c=’d’;
ss(str1,c); printf(“%s\n”,str1);
}
g12255g5219运g15904后的g17767出结g7536是( )。
A) ABCDDEFEDBD B) abcDDfefDbD
C) abcAAfefAbA D) Abcddfefdbd
(2002年9月)
18,有以下g12255g5219
int *f(int *x,int *y)
{ if(*x<*y)
return x;
else
return y;
}
main()
{ int a=7,b=8,*p,*q,*r};
}
g6203g15904后g17767出结g7536是( )。
A) 7,8,8 B) 7,8,7 C) 8,7,7 D) 8,7,8
(2003年4月)
19,有以下g12255g5219
第二部分 C语言程序设计同步训练
·251·
·251·
main()
{ char *s[]={"one","two","three"},*p;
p=s[1];
printf("%c,%s\n",*(p+1),s[0]);
}
g6203g15904后g17767出结g7536是( )。
A) n,two B) t,one C)w,one D) o,two
(2003年4月)
20,有以下g12255g5219
main()
{ int x[8]={8,7,6,5,0,0},*s;
s=x+3
printf("%d\n",s[2]);
}
g6203g15904后g17767出结g7536是( )。
A) 随机值 B) 0 C) 5 D) 6
(2003年4月)
21,g19417g16847以下g2001数
fun(char *s1,char *s2)
{ int i=0;
while(s1[i]==s2[i]&& s2[i]!=‘\0’)i++;
return(s1[i]== && s2{i}!==‘\0’);
}
g8504g2001数的g2163能是( )。
A) 将s2所指字符g1030赋给s1
B) g8616g17751s1和s2所指字符g1030的g3835g4579,若s1g8616s2的g3835,g2001数值为1,否则g2001数值为0
C) g8616g17751s1和s2所指字符g1030是否g11468等,若g11468等,g2001数值为1,否则g2001数值为0
D) g8616g17751s1和s2所指字符g1030的长度,若s1g8616s2的长,g2001数值为1,否则g2001数值为0
(2003年4月)
22,有以下g12255g5219
void fun(char *a,char *b)
{ a=b; (*a)++; }
main ()
{ char c1="A",c2="a",*p1,*p2;
p1=&c1; p2=&c2; fun(p1,p2);
printf(“&c&c\n”,c1,c2);
}
g12255g5219运g15904后的g17767出结g7536是( )。
A) Ab B) a C) Aa D) Bb
(2003年9月)
C语言程序设计上机指导与同步训练
·252·
·252·
23,若g12255g5219中已包含头文件 stdio.h,以下选项中,正确运用指针变量的g12255g5219g8585是
( )。
A) int *i=NULL; B) float *f=NULL;
scanf("&d",f); *f=10.5;
C) char t="m",*c=&t; D) long *L;
*c=&t; L=‘\0’;
(2003年9月)
24,有以下g12255g5219g8585
main()
{ int a=5,*b,**c;
c=&b; b=&a;
……
}
g12255g5219在g6203g15904g1114c=&b:b=&a;语句后,表g17810式:**c的值是( )。
A) 变量a的地址 B) 变量b中的值
C) 变量a中的值 D) 变量b的地址
(2003年9月)
25,已定义以下g2001数
fun(char *p2,char *p1)
{ while((*p2=*p1)!=‘\0’){p1++;p2++; } }
g2001数的g2163能是( )。
A) 将p1所指字符g1030复制到p2所指内存空间
B) 将p1 所指字符g1030的地址赋给指针 p2
C) 对p1和p2g1016个指针所指字符g1030进g15904g8616g17751
D) 检查p1和p2g1016个指针所指字符g1030中是否有‘\0’
(2003年9月)
一、g3647空题
1,以下g12255g5219的g2163能是将无符号八进制数字构g6116的字符g1030转g6454为十进制整数。例如,g17767g1849
的字符g1030为:556,则g17767出十进制整数366。g16843g3647空。
#include <stdio.h>
main()
{ char *p,s[6];
int n;
p=s;
gets(p);
n=*p-'0';
while(__________!='\0')n=n*8+*p-'0';
printf("%d \n",n);
}
(2000年4月)
2,下g2027g12255g5219的g17767出结g7536是 。
第二部分 C语言程序设计同步训练
·253·
·253·
void fun(int *n)
{ while( (*n)--);
printf(“%d”,++(*n));
}
main()
{ int a=100;
fun(&a);
}
(2001年4月)
3,以下g12255g5219的g17767出结g7536是 。
main()
{ int arr[ ]={30,25,20,15,10,5},*p=arr;
p++;
printf(“%d\n”,*(p+3));
}
(2001年4月)
4,g16786有以下g12255g5219
main()
{ int a,b,k=4,m=6,*p1=&k,*p2=&m;
a=pl==&m;
b=(*p1)/(*p2)+7;
printf(“a=%d\n”,a);
printf(“b=%d\n”,b);
}
g6203g15904该g12255g5219后,a的值为,b的值为 。
(2001年9月)
5,以下g12255g5219运g15904后的g17767出结g7536是 。
main()
{ char s[ ]=“9876”,*p;
for ( p=s ; p<s+2 ; p++) printf(“%s\n”,p);
}
(2001年9月)
6,以下g12255g5219的g17767出结g7536是 。
main()
{ char *p="abcdefgh",*r;
long *q;
q=(long*)p;
q++;
r=(char*)q;
printf("%s\n",r);
}
C语言程序设计上机指导与同步训练
·254·
·254·
(2002年4月)
7,以下g12255g5219的g17767出结g7536是 。
viod sub (int*,int,int);
main()
{ int x=0;
sub(&x,8,1);
printf("%d\n",x);
}
sub(int *a,int n,int k)
{ if(k<=n) sub(a,n/2,2*k);
*a+=k;
}
(2002年4月)
8,下面g12255g5219的运g15904结g7536是,。
void swap(int *a,int *b)
{ int *t;
t=a; a=b; b=t;
}
main()
{ int x=3,y=5,*p=&x,*q=&y;
swap(p,q);
printf(“%d%d\n”,*p,*q);
}
(2002年9月)