c/c++从入门到入土(11)
开始时间2023-05-13 12:24:38
结束时间2023-05-13 16:21:58
前言:说到指针,我也显得像个初学者,《深入理解计算机系统》之3.10“综合:理解指针”这样说:“指针……以一种统一方式,对不同数据结构中的元素产生引用”。也有人这么说“当函数以数据的指针为参数时,在函数体内通过*(取内容)可以读和写该指针指向的变量内容”。谈到指针不免谈及内存,运用指针落到实处能提高程序的运行效率和节省内存。下面让我们进入指针的学习吧!以下是自制思维导图参考于苏小红C语言程序设计(第四版):
作业九 指针
【C0214】若已定义 int a = 5 ; 下面对 ①、② 两个语句的正确解释是_______。 ① int *p = &a ; ② *p = a ; A.语句①和②中的*p含义相同,都表示给指针变量p赋值。 B.①和②语句的执行结果,都是把变量a的地址值赋给指针变量p。 C.①在对p进行说明的同时进行初始化,使p指向a;②将变量a的值赋给指针变量p。 D.①在对p进行说明的同时进行初始化,使p指向a;②将变量a的值赋给*p。
答案:D
体会:*可以理解为取内容符,同理&可以理解为取地址符。int *p=&a;这里变量声明语句中的星号*只是一个指针类型说明符,不是间接寻址运算符,所以,该语句不能理解为将&a的值赋值给p所指向的变量。它等同于下面两条语句int *p; p=&a;其含义为定义一个可以指向整型数据的指针变量p,并用整型变量a的地址值对指针变量p进行初始化,从而使指针变量p具体地指向了整型变量a;
【C0215】若需要建立如下图所示的存储结构,且已有说明float *p , m = 3.14 ; 则正确的赋值语句是_______。
A.p = m ; B.p = &m ; C.*p = m ; D.*p = &m ;
答案:B
体会:p = &m ;初始化指针变量p,使其指向m
【C0216】有如下语句 int a = 10 , b = 20 , *p1 , *p2 ; p1 = &a ; p2 = &b ; 如图左所示;若要实现图右所示的存储结构,可选用的赋值语句是_______。
A.*p1 = *p2 ; B.p1 = p2 ; C.p1 = *p2 ; D.*p1 = p2 ;
答案:B
体会:题目要求是p1也指向b,也即p1同样有p1=&b的效果,则只需对指针p1赋值为p2即可.A的效果是:p1所指向的地址的内容变为p2所指向的地址内容,效果如同a=b;C的效果是将p1指向p2所指向的值所代表的地址,效果如同a=*(int*)(b);D的效果是将p1所指向地址内容改为p2,效果如同,a=&b
【C0217】若有说明:int *p , n ; 以不正确的程序段是_______。 A.scanf( "%d" , &n ) ; *p = n ; B.scanf( "%d" , &n ) ; p = &n ; C.p = &n ; scanf( "%d", &p ) ; D.p = &n ; scanf( "%d" , p ) ;
答案:C
体会:p是一个地址但将一个值赋给了指针,无法进行直接寻址;
【C0218】下列选项中正确的语句组是_______。 A.char s[8] ; s = { "Beijing" } ; B.char *s ; s = { "Beijing" } ; C.char s[8] ; s = "Beijing" ; D.char *s ; s = "Beijing" ;
答案:D
体会:C语言规定可以对字符指针变量直接赋字符串常量,但不能给字符数组直接赋字符串常量,对字符数组赋字符串常量应使用的是strcpy函数。
【C0219】设char *s = "\ta\017bc" ; 则指针变量s指向字符串所占的字节数是_______。 A.9 B.5 C.6 D.7
答案:C
体会:\t是转义字符,a,\017是八进制的15,b,c,字符串长度为5加上平\0字节数为6
【C0220】下面程序段的运行结果是_______。 char a[ ] = "language" , *p ; p = a ; while ( *p != 'u' ) { printf( "%c" , *p – 32 ) ; p++ ; } A.LANGUAGE B.Language C.LANG D.langUAGE
答案:C
体会:初始化指针p指向字符数组a的首元素地址,当p没指向u,输出大写形式,后p指向下一个字母。
【C0221】若有定义:int a[5] ; 则a数组中首元素的地址可以表示为_______。 A.&a B.a + 1 C.a D.&a[1]
答案:C
体会:c语言中的数组名有特殊的含义,它代表存放数组元素的连续存储空间的首地址,即指向数组中第一个元素的指针常量。
【C0222】有以下程序段: int a[10] = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } , *p = &a[3] , b ; b = p[5] ; b中的值是_______。 A.5 B.6 C.8 D.9
答案:D
体会:字符数组首元素为三,往后推六个为9;
【C0223】若有定义:int *p[3] ;,则以下叙述中正确的是_______。 A.定义了一个基类型为int的指针变量p,该变量具有三个指针 B.定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针 C.定义了一个名为*p的整型数组,该数组含有三个int类型元素 D.定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
答案:B
体会:嗯B说的对。
【C0224】设有以下定义和语句: int a[3][2] = {1 , 2 , 3 , 4 , 5} , *p[3] ; p[0] = a[1] ; 则*( p[0] + 1 )所代表的数组元素是_______。 A.a[0][1] B.a[1][0] C.a[1][1] D.a[1][2]
答案:C
体会:为a[1][0+1].
【C0225】阅读以下函数: int fun( char *sl , char *s2 ){ int i = 0; while( sl[i] == s2[i] && s2[i] != '\0' ) i++ ; return( sl[i] == '\0' && s2[i] == '\0' ) ; } 此函数的功能是_______。 A.将s2所指字符串赋给s1 B.比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0 C.比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0 D.比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0
答案:C
【C0226】有以下程序段: #include<stdio.h> int main( ){ int a = 5 , *b , **c ; c = &b ; b = &a ; return 0 ; } 程序在执行了c = &b ; b = &a ; 语句后,表达式**c的值是________。 A.变量a的地址 B.变量b的值 C.变量a的值 D.变量b的地址
答案:C
体会: **c=*(*c)=*b=a
【C0227】若有以下说明和语句: int c[4][5] , ( *p )[5] ; p = c ; 能够正确引用c数组元素的是_______。 A.p + 1 B.*( p + 1 ) C.*( p + 1 ) + 3 D.*( p[0] + 2 )
答案:D
体会:下列四种表示a[i][j]的形式是等价的:a[i][j]==*(a[i]+j)==*(*(a+j)+j)==(*(a+i))[j];
【C0228】在声明语句“int *f( ) ;”中,标识符f代表的是_______。 A.一个用于指向整型数据的指针变量 B.一个用于指向一维数组的行指针 C.一个用于指向函数的指针变量 D.一个返回值为指针型的函数名
答案:D
体会:函数之间的握手(信息交换)是通过函数参数和返回值类实现的;
【C0229】设程序中若有如下说明和定义语句: #include <stdio.h> char fun(char *) ; int main( ){ char *s = "one" , a[5] = { 0},( *f1 )( ) = fun , ch ; ... } 以下选项中对函数fun的正确调用语句是_______。 A.( *f1 )( a ) ; B.*f1( *s ) ; C.fun( &a ) ; D.ch = *f1( s ) ;
答案:A
【C0230】不合法的main函数命令行参数的表示形式是_______。 A.int main( int a , char *c[ ] ) B.int main( int arc , char **arv ) C.int main( int argc , char *argv ) D.int main( int argv , char *argc[ ] )
答案:C
【C0231】在C程序中,指针变量能够赋同基类型地址值或NULL。 【C0232】请填空:建立如下图所示存储结构所需的说明语句是char *p,a;。 建立如下图所示为变量a输入数据的输入语句是scanf("%c",&a);。 建立如下图所示存储结构所需的赋值语句是p=&a;。
【C0233】以下程序段通过移动指针变量m,将如下图所示连续动态存储单元的值,从第一个元素起,输出到终端屏幕。请填空。(假设程序段中的所有变量均已正确说明)
for( m = p ; m – p < 10 ; m++ ) printf( "%d, " , *m ) ; printf( "\n" ) ;
【C0234】以下程序段通过指针变量q,给如下图所示连续动态存储单元赋值(在此过程中不能移动q,且要求以递增顺序)。请填空。(假设程序段中的所有变量均已正确说明)
for(k=0;k<10;k++) scanf( "%d" , q + k );
【C0235】若有以下定义和语句,在程序中引用数组元素x[i]的形式可以是p[i]和x[i]。(假设i已正确说明并赋值。) int x[10] , *p ; p = x;
【C0236】str_len函数的功能是计算str所指字符串的长度,并作为函数值返回,请填空。 int str_len( char *str ){ int i ; for( i = 0 ; *(str+i)!='\0'; i++ ); return(i) ; }
【C0237】下面程序的运行结果是gae。 #include<stdio.h> int main( ){ char a[ ] = "Language" , b[ ] = "Programe" ; char *p1 , *p2 ; int k ; p1 = a ; p2 = b ; for( k = 0 ; k <= 7 ; k++ ) if( *( p1 + k ) == *( p2 + k ) ) printf("%c" , *( p1 + k ) ) ; return 0 ; }
分析:输出下标相同且值相同的字符形式。
【C0238】以下程序的运行结果是bcdABCD。 #include<stdio.h> #include<string.h> int main( ){ char s[20] = "abcd" ; char *sp = s ; sp++ ; puts( strcat( sp , "ABCD" ) ) ; return 0 ; }
【C0239】下面程序的运行结果是7,8,8。 #include<stdio.h> int *f( int *x , int *y ){ if( *x + 5 < *y ) return x ; else return y ; } int main( ){ int a = 7 , b = 8 , *p , *q , *r ; p = &a ; q = &b ; r = f( p , q ) ; printf( "%d,%d,%d\n" , *p , *q , *r ) ; return 0 ; }
【C0240】下面程序的运行结果是84。 #include<stdio.h> void f( int y , int *x ){ y = y + *x ; *x = *x + y ; } int main( ){ int x = 2 , y = 4 ; f( y , &x ) ; printf( "%d%d\n" , x , y ) ; return 0 ; }
【C0241】下面程序的运行结果是3 142。 #include<stdio.h> void fun( int *a , int *b ){ printf( "%d %d" , *a , *b ) ; *a = 2 ; *b = 4 ; } int main( ){ int x = 1 , y = 3 ; fun( &y , &x ) ; printf( "%d%d" , x , y ) ; return 0 ; }
【C0242】下面程序的运行结果是efgh。 #include<stdio.h> #include<string.h> char *ss( char *s ){ return s + strlen( s ) / 2 ; } int main( ){ char *p , *str = "abcdefgh" ; p = ss( str ) ; printf( "%s\n" , p ) ; return 0 ; }
【C0243】下面程序的运行结果是w,one。 #include<stdio.h> int main( ){ char *s[ ] = { "one" , "two" , "three" } , *p ; p = s[1] ; printf( "%c,%s\n" , *( p + 1 ) , s[0] ) ; return 0 ; }
【C0244】下面程序的运行结果是7。 #include<stdio.h> int main( ){ int a[ ][3]={{1 , 2 , 3} , {4 , 5 , 0}} , ( *pa )[3] , i ; pa = a ; for( i = 0 ; i < 3 ; i++ ) if( i < 2 ) pa[1][i] = pa[1][i] – 1 ; else pa[1][i] = 1 ; printf( "%d\n" , a[0][1] + a[1][1] + a[1][2] ) ; return 0 ; }
【C0245】以下程序的功能是:输出a数组中的所有字符串,请完善程序。 #include<stdio.h> int main( ){ char *a[ ]={"ABC" , "DEFGH" , "IJ" , "KLMNOP"} ; int i = 0 ; for( ; i < 4 ; i++ ) printf( "%s\n" , *(a+i)) ; return 0 ; }
【C0246】下面程序的功能是:将一个整数字符串转换为一个整数,例如将字符串“-1234”转换为数值-1234。请完善程序。 #include<stdio.h> #include<string.h> int chnum( char *p ){ int num = 0 , k , len , j ; len = strlen( p ) ; for( ; *p!='\0'; p++ ){ k = *p-'0'; j = ( --len ) ; while( j-- > 0 ) { k = k * 10 ; } num = num + k ; } return ( num ); } int main( ){ char s[6]; int n ; gets( s ) ; if( *s == '-' ) n = -chnum( s + 1 ) ; else n = chnum( s ) ; printf( "%d\n" , n ) ; return 0 ; }
【C0247】下面程序的功能是:找出数组中的最大值和该值所在的元素下标,数组元素从键盘输入。请完善程序。 #include<stdio.h> Int main( ){ int x[10] , *p1 , *p2 , k ; for( k = 0 ; k < 10 ; k++ ) scanf( "%d" , x + k ) ; for( p1 = x , p2 = x ; p1 - x < 10 ; p1++ ) if( *p1 > *p2 ) p2 = p1; printf( "MAX = %d , INDEX = %d\n" , *p2 , p2-x) ; return 0 ; }
【C0248】下面程序的功能是:输出两个数中最大值。请完善程序。 #include<stdio.h> int max(int a,int b) ; int main( ){ int x , y , ( *p )( ) ; scanf( "%d%d" , &x , &y ) ; p=max; printf( "%d\n" , ( *p )( x , y ) ) ; return 0 ; } int max(int a , int b ){ return (a > b ? a : b ) ; }
编程题!!
第一题
6-1 【C0249】三数排序 分数 10 作者 C语言程序设计,沈国荣,浙江大学出版社 单位 石家庄铁道大学 编写函数void sort( int *a , int *b , int *c ) 用于实现将给定的三个整数a、b、c按照由小到大排序,在main()中输入a、b、c,调用sort()并输出排序的结果。 裁判测试程序样例: #include<stdio.h> void sort( int *a, int *b, int *c ); int main(){ int a, b, c ; scanf( "%d%d%d", &a, &b, &c) ; sort( &a, &b, &c ) ; printf( "The result is%5d%5d%5d\n", a, b, c ) ; return 0 ; } /* 请在这里填写答案 */ 输入样例: 3 2 1 输出样例: The result is 1 2 3 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
void sort( int *a , int *b , int *c ) { int temp ; if( *a > *b ) { temp = *a ; *a = *b ; *b = temp ; } if( *a > *c ) { temp = *a ; *a = *c ; *c = temp ; } if( *b > *c ) { temp = *b ; *b = *c ; *c = temp ; } }
----------分割线----------
第二题
6-2 【C0250】比较字符串 分数 10 作者 C语言程序设计,沈国荣,浙江大学出版社 单位 石家庄铁道大学 用户自定义函数int strcompare( char *str1 , char *str2 ) 用于实现两个字符串str1,str2的比较,在main()中输入字符串a和b,调用strcompare()并输出比较的结果。 字符串比较规则:当str1 == str2时,函数返回值为0;如果str1 ≠ str2,返回它们二者第一个不相同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不相同,“O”与“A”之差为79-65=14);如果str1>str2,则输出正值;如str1<str2,则输出负值。 裁判测试程序样例: #include<stdio.h> int strcompare( char *str1,char *str2); int main( ){ char a[80],b[80]; gets(a); gets(b); printf( "%d\n", strcompare(a,b)) ; return 0 ; } /* 请在这里填写答案 */ 输入样例1: 13579 13579 输出样例1: 0 输入样例2: 12345789 12346789 输出样例2: -1 ``` 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
int strcompare( char *str1 , char *str2 ) { int i = 0 ; while( ( *( str1 + i ) == *( str2 + i ) ) &&( *( str1 + i ) != '\0' ) ) i++ ; return( *( str1 + i ) - *( str2 + i ) ) ; }
总结:指针的确有很多不可替代的优势,比如可以提高程序执行效率、程序运行过程中动态开辟内存空间等,因此指针在C语言体系中有这不可替代的地位。
每日一mo:如果你跟我一样,在寝室里不穿上衣,那我觉得这个天气实在是,泰热辣!
标签:第十一天,char,p1,return,int,c++,坐牢,main,指针 From: https://www.cnblogs.com/R-f-12/p/17397622.html