C语言指针选择题-创新互联

某不知名学校大一C语言指针选择题吐槽加个人解析 标红的选项为答案

公司主营业务:成都网站建设、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出沙县免费做网站回馈大家。

作业的代码格式都不是很好 看得人头皮发麻

我发给别人看时 他们都异口同声地说:

这么写让别人看到第二天就可以领工资了

这期也问了很多大佬 保证一下准确性 

如果还是出错了。。。那就请大佬在评论区教我做事 在下恳请赐教

第一题

1 . 单选题 简单 3分

若要对a进行合理的自增运算,则a应具有( )说明。

A.

int a[3][2];

B.

char *a[]={"12","ab"};

C.

char (*a)[3]

D.

int b[10],*a=b;

解析

数组名是地址常量,不允许修改,因此A,B选项不正确;C选项a为指向一维字符数组的指针,不保证进行自增运算后的地址还是合法的地址。

老师点评

暂无评语

个人解析:A选项里的a是一个二维数组的首地址 一般都是拿下标寻找元素 比如用a[0][0]找到第一个元素 B选项是一个指针数组 C选项是一个数组指针 关于二者的区别 推荐一篇文章

http://t.csdn.cn/hM8Ab

B选项说了 指针数组 那a就是数组的首地址 不能自增来寻找元素 C其实可以自增运算 比如一个int型的指针 p+1后它的地址就会加4 这是因为int型变量在计算机里面占了4个字节 但是题目说错的原因是不确定指针会不会乱指 合情合理的错误 D的话没什么争议 因为数组名等于首地址 直接赋给了指针a a就可以自增访问数组元素 C选项指针运算可以看下面的代码:

#includeint main()
{
int n1;
int n2;
int n3;
int n4;
printf("&n1=%d\n", &n1);
printf("&n2=%d\n", &n2);
printf("&n3=%d\n", &n3);
printf("&n4=%d\n", &n4);
putchar('\n');
// 获取n1的首地址
int* p = &n1;
printf("p = %d\n", p);
printf("p - 1 = %d\n", p - 1);
printf("p - 2 = %d\n", p - 2);
printf("p - 3 = %d\n", p - 3);
putchar('\n');
// 给n1到n4赋值
*p = 111; // p指向n1
*(p - 1) = 222; // p - 1后前后移动4字节,现在指向n2
*(p - 2) = 333; // p - 2后前后移动8字节,现在指向n3
*(p - 3) = 444; // p - 3后前后移动12字节,现在指向n4
printf("n1=%d\n", n1);
printf("n2=%d\n", n2);
printf("n3=%d\n", n3);
printf("n4=%d\n", n4);
return 0;
}

D选项运算:

# includeint main()
{
	
  int b[10],*a=b;
  b[0]=0;b[1]=1;
  
  printf("%d",*(a+1)) ;
  //输出为1 也就是b[1]的值 

	return 0;
}
第二题

2 . 单选题 中等 3分

下面程序运行时从键盘上输入:1 2 3↙,其输出结果是( )。

#includeint main()
{
	int a[3][2] = { 0 }, (*ptr)[2], i, j;
	for ( i = 0; i< 2; i++ )
	{
		ptr = a + i; scanf( "%d", ptr ); ptr++;
	}
	for ( i = 0; i< 3; i++ )
		for ( j = 0; j< 2; j++ )
			printf( "%d", a[i][j] );
	return(0);
}

A.

编译错误信息

B.

102000

C.

123000

D.

102030

解析

数组经初始化后,全部元素值为0,第一个for循环将每一行的某个元素设置为输入值。

老师点评

暂无评语

个人解析:感觉这种代码都给你的题目 自己上vscode逐步调试也能看出个所以然 我这边解析就把代码打个注释 知道每一行代码是干嘛的 然后如果有知识点我会补充

#includeint main()
{
	int a[3][2] = { 0 }, (*ptr)[2], i, j;//初始化了一个二维数组a 同时创建了一个数组指针
	for ( i = 0; i< 2; i++ )
	{
		ptr = a + i;//指针分别指向数组的元素 
        scanf( "%d", ptr ); ptr++;
	}
	for ( i = 0; i< 3; i++ )//二重遍历输出a数组
		for ( j = 0; j< 2; j++ )
			printf( "%d", a[i][j] );
	return(0);
}

为什么输出是 102000呢 我们看输入时候的循环 只进行了两次 因此我们才输入了两个数1,2;

二维数组本来是 被初始化为{0,0} {0,0}{0,0}的 ,然后指针分别指向了a[0][0]和a[1][0] 它们分别赋值为1,2;因此输出为102000

第三题

3 . 单选题 简单 3分

设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是( )。

A.

c=*p1+*p2;

B.

p2=c;

C.

p1=p2;

D.

c=*p1*(*p2);

 回答正确

解析

不能对指针变量赋值普通变量的值。

老师点评

暂无评语

个人解析:我们一个指针假设为int*p 那么p是指针变量 *p是指针地址上的内容B左边是指针是地址 右边是字符常量 自然不能赋值

第四题

4 . 单选题 中等 3分

下面判断正确的是( )。

A.

char *a="china"; 等价于 char *a; *a="china" ;

B.

char str[10]={"china"}; 等价于 char str[10]; str[]={"china";}

C.

char *s="china"; 等价于 char *s; s="china" ;

D.

char c[4]="abc",d[4]="abc"; 等价于 char c[4]=d[4]="abc" ;

解析

A选项中,*a相当于一个字符对象,只能赋值字符信息;B、D选项中不能数组整体赋值。

老师点评

暂无评语

个人分析:A选项char *a;*a="china";这里a只是指向一地址,并没有分配实际内存所以 *a="china";就是错的。如果写成char a[20];*b="china";就是对的 前面 的 char *a="china"; 的意思是把字符串 china"的首地址赋给指针a

B选项 会报错的 数组只能在定义的时候初始化 后面赋值要点明下标

C选项 左边地址 右边也是地址 没得问题

D选项逆大天没人会选吧 "abc"是字符串不能用赋给单个字符

第五题

5 . 单选题 简单 3分

下面判断正确的是( )。

A.

char *a="china"; 等价于 char *a; *a="china" ;

B.

char str[10]={"china"}; 等价于 char str[10]; str[]={"china";}

C.

char *s="china"; 等价于 char *s; s="china" ;

D.

char c[4]="abc",d[4]="abc"; 等价于 char c[4]=d[4]="abc" ;

解析

A选项中,*a相当于一个字符对象,只能赋值字符信息;B、D选项中不能数组整体赋值。

老师点评

暂无评语

个人解析:跟第四题重复 略

第六题

6 . 单选题 简单 3分

下面程序段中,for循环的执行次数是( )。

char *s = "\ta\018bc";
for (; *s != '\0'; s++ )
	printf( "*" );

A.9

B.7

C.6

D.5

解析

s所指的字符串长度为6,其所指的字符串包含的有效字符分别为‘\t’‘a’‘\01’‘8’‘b’‘c’。

老师点评

暂无评语

个人解析:
\ddd(d为任意数字)在转义字符中表示三位八进制,因为八进制中的数只有0-7,因此\018不能表示三位八进制,所以取\01。而\t在转义字符中表示制表符,所以\t算一次。然后a一次,\01一次,8一次,b一次,c一次。所以是6次。

第七题

7 . 单选题 简单 3分

下面程序段执行后的输出结果是( )。

char *s = "abcde";
s += 2;
printf( "%d", s );

A.

cde

B.

字符'c'

C.

字符'c'的地址

D.

不确定

解析

s的值为字符c的地址,因此按照十进制输出该地址值。

老师点评

暂无评语

个人解析:单指针s是地址 加了取值符号*s是地址上的值

第八题

8 . 单选题 中等 4分

下面程序执行后的输出结果是( )。

#includechar cchar( char ch )
{
	if ( ch >= 'A' && ch<= 'Z' )
		ch = ch - 'A' + 'a';
	return(ch);
}




int main()
{
	char s[] = "ABC+abc=defDEF", *p = s;
	while ( *p )
	{
		*p = cchar( *p );
		p++;
	}
	printf( "%s", s );
	return(0);
}

A.

abc+ABC=DEFdef

B.

abc+abc=defdef

C.

abcaABCDEFdef

D.

abcabcdefdef

解析

cchar函数将大写字母转换为小写字母。

老师点评

暂无评语

个人解析:直接上注释吧

#includechar cchar( char ch )
{
	if ( ch >= 'A' && ch<= 'Z' )//如果是A~Z的
		ch = ch - 'A' + 'a';//利用ascll码加减转化成小写
	return(ch);
}




int main()
{
	char s[] = "ABC+abc=defDEF", *p = s;//指针指向字符串
	while ( *p )//指针不为空 进行循环
	{
		*p = cchar( *p );//调用函数
		p++;//指针逐个后移
	}
	printf( "%s", s );
	return(0);
}
第九题

9 . 单选题 中等 3分

以下函数的功能是( )。

int fun( char *a, char *b )
{
	while ( (*a != '\0') && (*b != '\0') && (*a == *b) )
	{
		a++; b++;
	}
	return(*a - *b);
}

A.

计算a和b所指字符串的长度之差

B.

将b所指字符串连接到a所指字符串中

C.

将a所指字符串连接到b所指字符串后面

D.

比较a和b所指字符串的大小

解析

*a,*b是a,b指针所指的字符串中的相应字符。

老师点评

暂无评语

个人解析:实现的是函数strcmp的功能 两个字符串比较大小 那它为什么要用指针重复造轮子?

当然是为了考你啊

第十题

10 . 单选题 中等 3分

若有定义char *st="how are you";下列程序段中正确的是( )。

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);

D.

char a[],*p; strcpy(p=&a[1],st+2);

解析

字符串处理函数strcpy的两个参数都是字符型指针,完成将一个字符串复制到另一个字符串中。B选项中a为数组名,不能更改值;C选项中st所指的字符串中包括12个字符,数组a无法接收;D选项啊中字符数组a定义错误。

老师点评

暂无评语

个人解析:strcpy函数要复制与被复制的都是传入地址str(a,b) b复制给a; A两个地址 没问题B左边是地址但不能自增(前面题有说)右边是地址C左边的数组太小了 右边有12个字符 注意空格算字符 还有一个隐藏的'\0'结束字符 D没说明字符数组大小也没初始化 不能使用下标

十一题

11 . 单选题 简单 3分

若有定义char a[10],*b=a;不能给数组a输入字符串的语句是( )。

A.

gets(a);

B.

gets(a[0]);

C.

gets(&a[0]);

D.

gets(b);

解析

gets函数的参数为接收输入信息的字符串地址。

老师点评

暂无评语

个人解析:做到这了还连谁是指向地址都看不出来建议多看看书,注意数组只有数组名是一个特殊的指针

十二题

12 . 单选题 中等 3分

下面程序执行后的输出结果是( )。

#include#includevoid fun( char *s, int p, int k )
{
	int i;
	for ( i = p; i< k; i++ )
		*(s + i) = s[i + 2];
}




int main()
{
	char s[] = "abcdefg";
	fun( s, 3, strlen( s ) ); puts( s );
	return(0);
}

A.

abcdefg

B.

abc

C.

defg

D.

abcfg

解析

函数fun的功能将字符串s从下标为3的字符开始用其后下标增加2的位置的字符替代。

老师点评

暂无评语

个人解析:废话少说 上注释

小知识 strlen测量出的字符串长度不包含结束的'\0' 而sizeof会包含

#include#includevoid fun( char *s, int p, int k )//传入 s字符串 p=3 k=7
{
	int i;
	for ( i = p; i< k; i++ )
		*(s + i) = s[i + 2];//从下标3开始的字符换成它后面两位 如d->f
}




int main()
{
	char s[] = "abcdefg";
	fun( s, 3, strlen( s ) ); puts( s );//strlen函数获取字符串长度 puts输出
	return(0);
}
第十三题

13 . 单选题 简单 4分

s1和s2已正确定义并分别指向两个字符串。若要求:当s1所指串大于s2所指串时,执行语句S;则以下选项中正确的是( )。

A.

if(s1>s2) S;

B.

if(strcmp(s1,s2)) S;

C.

if(strcmp(s2,s1)>0) S;

D.

if(strcmp(s1,s2)>0) S;

解析

int strcmp(const char *s1, const char *s2);strcmp比较字符串s1和s2的大小。s1和s2可以是字符串常量、字符数组或指向字符数组的指针,比较结果为: ①若s1大于s2,返回大于0的整数值; ②若s1等于s2,返回0; ③若s1小于s2,返回小于0的整数值。

老师点评

暂无评语

个人解析:我觉得原本的解析已经说明白了而且上次作业也学了这个函数 这里略过

第十四题

14 . 单选题 中等 3分

以下与库函数strcpy(char *p1,char *p2)功能不相等的程序段是( )。

A.

strcpy1(char *p1,char *p2) { while ((*p1++=*p2++)!='\0') ; }

B.

strcpy2(char *p1,char *p2) { while ((*p1=*p2)!='\0') { p1++; p2++ } }

C.

strcpy3(char *p1,char *p2) { while (*p1++=*p2++) ; }

D.

strcpy4(char *p1,char *p2) { while (*p2) *p1++=*p2++ ; }

解析

D选项没有复制最后的字符串结束符。

老师点评

暂无评语

个人解析:D选项进行到p2指向结束符\0的时候循环就停止了 后面的语句也就不会执行 所有少一个结束符没复制

第十五题

15 . 单选题 中等 3分

若有定义char s1[]="string1",s2[8],*s3,*s4="string2";则对库函数strcpy错误调用的是( )。

A.

strcpy(s1,"string2");

B.

strcpy(s2,"string1");

C.

strcpy(s3,"string1");

D.

strcpy(s2,s1);

解析

s3没有指向任何字符数组,没有存储字符串的存储空间。

老师点评

暂无评语

个人解析:s3是空指针 好了 本题结束

第十六题

16 . 单选题 中等 3分

以下与库函数strcmp(char *s,char *t)功能相等的程序段是( )。

A.

strcmp1(char *s,char *t) { for ( ; *s++==*t++; ) if (*s=='\0') return 0 ; return (*s-*t) ; }

B.

strcmp2(char *s,char *t) { for ( ; *s++==*t++; ) if (!*s) return 0 ; return (*s-*t) ; }

C.

strcmp3(char *s,char *t) { for ( ; *t==*s; ) { if (!*t) return 0 ; t++ ; s++ ; } return (*s-*t) ; }

D.

strcmp4(char *s,char *t) { for ( ; *s==*t;s++,t++ ) if (!*s) return 0 ; return (*t-*s) ; }

解析

int strcmp(const char *s1, const char *s2);strcmp比较字符串s1和s2的大小。s1和s2可以是字符串常量、字符数组或指向字符数组的指针,比较结果为: ①若s1大于s2,返回大于0的整数值; ②若s1等于s2,返回0; ③若s1小于s2,返回小于0的整数值。

老师点评

暂无评语

个人解析(吐槽) :平时写程序别这么用for循环 只有一个条件就用while它不香吗 纯粹为了考而考 你把这道题当作while来看就行  !*s的意思是*s为0执行if语句 不加!就是不为0的意思

我们是要被减的字符串为0时候停止 所有选C

第十七题

17 . 单选题 中等 3分

下面程序执行后的输出结果是( )。

#include#includeint main()
{
	char b1[8] = "abcdefg", b2[8], *pb = b1 + 3;
	while ( --pb >= b1 )
		strcpy( b2, pb );
	printf( "%d", strlen( b2 ) );
	return(0);
}

A.

8

B.

7

C.

3

D.

1

解析

while语句时将字符串b2进行了3赋值,最后一次将字符串b1赋给了b2,因此字符串b2的长度为7。

老师点评

暂无评语

个人解析:上注释

这个题是真的恶心 白白写一个循环 结果其实就是要复制字符串b1还写个循环迷惑你

#include#includeint main()
{
	char b1[8] = "abcdefg", b2[8], *pb = b1 + 3;//指向下标为3的字符 也就是d
	while ( --pb >= b1 )--i先自减 所以--pb指向下标为2的字符 也就是c 如果大于等于b1首地址 也就是字符a的地址 所有一共循环3次
		strcpy( b2, pb );//这个函数是复制整个字符串 注意
//第一次复制 cdefg 第二次复制bcdefg 第三次abcdefg 所有长度是7
	printf( "%d", strlen( b2 ) );//输出b2的长度
	return(0);
}
第十八题

18 . 单选题 中等 3分

函数char* fun(char *p){ return p; }的返回值是( )。

A.

无确切的值

B.

形参p中存放的地址值

C.

一个临时存储单元的地址

D.

形参p自身的地址值

解析

无。

老师点评

暂无评语

个人解析:函数返回值就是定义时定义的函数类型 这题是char*型 自然就是返回地址了

第十九题

19 . 单选题 简单 3分

若有定义int(*p)();标识符p可以( )。

A.

表示函数的返回值

B.

指向函数的入口地址

C.

表示函数的返回类型

D.

表示函数名

解析

函数指针的定义

老师点评

暂无评语

个人解析:这。。。都放到函数入口位置了难道会是其他东西吗

第二十题

20 . 单选题 简单 3分

若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是( )。

A.

p=max;

B.

p=max(a,b);

C.

*p=max;

D.

*p=max(a,b);

解析

函数指针的定义

老师点评

暂无评语

个人解析:概念性的东西 推荐这个大佬写的文章http://t.csdn.cn/y0kfx了解一下什么是函数指针

第二十一题

21 . 单选题 简单 3分

若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是( )。

A.

(*p)max(a,b)

B.

*pmax(a,b);

C.

(*p)(a,b);

D.

*p(a,b);

跟20题重复了啊

第二十二题

22 . 单选题 中等 3分

以下正确的是( )。

A.

int *b[]={1,3,5,7,9} ;

B.

int a[5], *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

C.

int a[]={1,3,5,7,9}, *num[5]={a[0],a[1],a[2],a[3],a[4]};

D.

int a[3][4],(*num)[4]; num[1]=&a[1][3];

解析

数组指针和指针数组的操作限定

老师点评

暂无评语

个人解析:首先我们要知道[]的运算优先级比*高 所以int(*p)[]是数组指针 数组的指针 指向整个数组

int*p[]是指针数组 指针数组 存放一堆指针的数组

A选项是指针数组 那你说里面是不是应该放一堆地址而不是常量

B选项就放的都是地址 没啥问题

C选项放的不是地址 错

D选项是一个(*num)[4];数组指针 但是题目没用到 num[1]=&a[1][3];用一个地址赋值给一个常量是万万不可取的

第二十三题

23 . 单选题 中等 4分

有以下程序段:

int a[3][2] = { 1, 2, 3, 4, 5, 6, }, *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]

解析

p[0]是a[1][0]的地址,因此p[0]+1就是a[1][1]的地址。

老师点评

暂无评语

个人解析:解析个锤子 上面解析已经把话说完了

第二十四题

下面程序段执行后的输出结果是( )。

int a[] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 }, *q[4], k;
for ( k = 0; k< 4; k++ )
	q[k] = &a[k * 3];
printf( "%d", q[3][0] );

A.

8

B.

16

C.

20

D.

输出不合法

解析

q为指针数组,元素为指向整型数据的指针;经过for语句后q数组分别保存了a[0]、a[3]、a[6]、a[9]的地址。q[3]即为a[9]的地址,q[3][0]的含义即为从a[9]地址开始找地址差为0的元素,即a[9]。

老师点评

暂无评语

个人解析:*q[4]是一个指针数组 int* q[4]; q 有4个元素,每个元素的类型是int*

q[3][0]的意思是 &a[9]+0;  当然这样表示太花里胡哨了 直接用*q[3]就可以输出的

第二十五题

25 . 单选题 中等 4分

下面程序执行后的输出结果是( )。

#includeint main()
{
	int x[5] = { 2, 4, 6, 8, 10 }, *p, **pp;
	p = x, pp = &p;
	printf( "%d", *(p++) );
	printf( "%3d", **pp );
	return(0);
}

A.

4 4

B.

2 4

C.

2 2

D.

4 6

解析

p保存x数组首元素的地址,pp保存p的地址;经过第一个printf函数后,将p当前所指元素输出,并将p移动到数组中下一个元素,第二个printf函数执行时借助二级指针输出数组的第二个元素。

老师点评

暂无评语

个人解析:花里胡哨 上注释

#includeint main()
{
	int x[5] = { 2, 4, 6, 8, 10 }, *p, **pp;//一级指针和二级指针
	p = x, pp = &p;//一级指针指向数组 二级指针指向一级指针的地址
	printf( "%d", *(p++) );//p++先取值再自增 所有这里取值等价与*p 也就是数组第一个元素2
	printf( "%3d", **pp );//由于上面p++了所有这里指向的是数组第二个元素
	return(0);//如果是*pp输出的就是p的地址了
}
第二十六题

26 . 单选题 简单 4分

以下叙述中正确的是( )。

A.

C语言允许main函数带形参,且形参个数和形参名均可由用户指定

B.

C语言允许main函数带形参,形参名只能是argc和argv

C.

当main函数带有形参时,传给形参的值只能从命令行中得到

D.

若有说明int main(int argc,char **argv),则argc的值必须大于1

解析

main函数的参数argv[argc]是一个空指针。如果argc大于1,则argv[0]是一个指向程序名的字符串指针,argv[1]~argv[argc-1]是指向命令行参数的字符串指针。

个人解析:推荐我的另一篇文章 看完就懂了http://t.csdn.cn/JPuNB

第二十七题

27 . 单选题 简单 4分

关于主函数的形式参数,下列说法正确的是( )。

A.

是在程序编译时获得实际值

B.

不可以由用户自己定义名字

C.

类型可以是实型

D.

可以有两个

解析

main函数的参数argv[argc]是一个空指针。如果argc大于1,则argv[0]是一个指向程序名的字符串指针,argv[1]~argv[argc-1]是指向命令行参数的字符串指针。

老师点评

暂无评语

个人解析: 推荐我的另一篇文章 看完就懂了http://t.csdn.cn/JPuNB

第二十八题

28 . 单选题 中等 4分

不合法的main函数形式参数表示是( )。

A.

main(int a,char *c[])

B.

main(int arc,char **arv)

C.

main(int argc,char *argv)

D.

main(int argv,char *argc[])

解析

main函数的参数argv[argc]是一个空指针。如果argc大于1,则argv[0]是一个指向程序名的字符串指针,argv[1]~argv[argc-1]是指向命令行参数的字符串指针。

个人解析:正确的方法有三种

(1).int main(void)
(2).int main(int argc,char *argv[]) = int main(int argc,char **argv).

第二十九题

29 . 单选题 中等 4分

【提高题】若定义了以下函数:

void f( …… )
{
	……
	*p = (double *) malloc( 10 * sizeof(double) );
	……
}

p是该函数的形参,要求通过p把动态分配存储单元的地址传回主调函数,则形参p

的正确定义应当是( )。

A.

double *p

B.

float **p

C.

double **p

D.

float *p

解析

二级指针可以指向整个数组。

老师点评

暂无评语

个人解析:首先他要返回的是double类型 排除BD 在定义时,用malloc(10*sizeof(double)) 开辟了一个内存空间,返回的是一个地址,所以*P实际上代表的是一个地址;所以P是一个二级指针;所以在声明时要用 double **p

第三十题

30 . 单选题 中等 4分

【提高题】有以下程序:

#include#includeint main()
{
	char *p, *q;
	p = (char *) malloc( sizeof(char) * 20 ); q = p;
	scanf( "%s%s", p, q ); printf( "%s %s", p, q );
	return(0);
}

程序执行后若从键盘上输入:abc def↙,则输出结果是( )。

A.

def def

B.

abc def

C.

abc d

D.

d d

解析

空格在作为scanf函数接收字符串的结束符。

老师点评

暂无评语

个人解析:这里是定义了一个动态数组 空间是20*char 但是没有用free释放空间 这个习惯很不好大家不要学题目 但是 重点来了 p和q都指向了同一个地址 所以他们都指向了这个动态数组

先输入abc 然后空格 这时p就输入完成了 再输入def给q
但是p q是指向同一地址的 所以q新输入的值把p覆盖了 

后面printf出p和q的值 实际上输出的都是同一个地址的值 也就是同一个地址的值输出了两遍

#include#includeint main()
{
	char *p, *q;
	p = (char *) malloc( sizeof(char) * 20 ); 
    q = p;//指向了同一地址 阴间
	scanf( "%s%s", p, q );//先输入abc 然后空格 这时p就输入完成了 再输入def给q
     //但是p q是指向同一地址的 所以q新输入的值把p覆盖了 
     printf( "%s %s", p, q );
	return(0);
}

终于写完了 写了我三个半小时 累傻了 觉得有用的话 留个小小的赞吧

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章题目:C语言指针选择题-创新互联
本文地址:http://hbruida.cn/article/diijhh.html