十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
某不知名学校大一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#include void 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#include int 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#include int 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元起,快前往官网查看详情吧