1、以下代码输出的结果是什么?
1. char *p1="name";
2. char *p2;
3. p2=(char*)malloc(20);
4. memset (p2, 0, 20);
5. while(*p2++ = *p1++);
6. printf("%s",p2);
答案:输出空字串。
分析:*p2++相当于*(p2++),先取p2值再与*结合,语句执行完p2再加加,*p1++类似。所以第5行代码执行完后将字符串"name"复制到第3行中所分配的内存中。但是由于第5行在复制数据的同时p2所指向的地址在变化,所以第5行代码执行完后p2所指的位置如下:

1. char *p1="name";
2. char *p2;
3. p2=(char*)malloc(20);
4. memset (p2, 0, 20);
5. while(*p2++ = *p1++);
6. printf("%s",p2);分析:*p2++相当于*(p2++),先取p2值再与*结合,语句执行完p2再加加,*p1++类似。所以第5行代码执行完后将字符串"name"复制到第3行中所分配的内存中。但是由于第5行在复制数据的同时p2所指向的地址在变化,所以第5行代码执行完后p2所指的位置如下:

因此输出的结果为空。
2.输出的x,y分别是多少?
1. int x=20,y=35;
2. x = y++ + x++;
3. printf("%d,%d ",x,y);
4. y = ++y + ++x;
5. printf("%d,%d",x,y);
答案:56,36; 57,94
分析:x = y++ + x++等价于x = (y++) + (x++),第2行代码等号的右边值为55,y++先取y值再加加,x++也相同,所以x=55,但是由于式子中有x++,所以第2行代码执行后x的值变成了56,y变成了36。y = ++y + ++x相当于y = (++y) + (++x),++y是先将y值加一再取y值,++x也如此,因此y=37+57,结果x=57,y=94。
3.下面输出的结果是多少?
printf("%c",*("Monday!"));
答案:M
分析:字符串"Monday!"返回的是一个字符串指针(char *),*(pch)就是字符串的第一个字符,所以为M。
2.输出的x,y分别是多少?
1. int x=20,y=35;
2. x = y++ + x++;
3. printf("%d,%d ",x,y);
4. y = ++y + ++x;
5. printf("%d,%d",x,y);分析:x = y++ + x++等价于x = (y++) + (x++),第2行代码等号的右边值为55,y++先取y值再加加,x++也相同,所以x=55,但是由于式子中有x++,所以第2行代码执行后x的值变成了56,y变成了36。y = ++y + ++x相当于y = (++y) + (++x),++y是先将y值加一再取y值,++x也如此,因此y=37+57,结果x=57,y=94。
3.下面输出的结果是多少?
printf("%c",*("Monday!")); 分析:字符串"Monday!"返回的是一个字符串指针(char *),*(pch)就是字符串的第一个字符,所以为M。
本文通过三个实例探讨了C语言中的指针操作与变量运算规则,包括字符串复制、变量计算及字符输出,帮助读者理解复杂的表达式求值顺序。

762

被折叠的 条评论
为什么被折叠?



