70,035
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
int main()
{
char notes[]="See you at the snack bar.";
char * ptr;
ptr=notes;
puts(++ptr);
notes[7]='\0';
puts(++ptr);
return 0;
}
[/quote]
我已经提前申请了。
zhangxiang:这是你的专利。
zhao4zhong1:不,这是你的专利!
#include <stdio.h>
int main()
{
char notes[] = "See you at the snack bar.";
char * ptr;
ptr = notes;
puts(++ptr);
notes[7] = '\0';
puts(++ptr);
return 0;
}
//ee you at the snack bar.
//e you
char notes[]="See you at the snack bar.";
这一句,字面串"See you at the snack bar."在程序转换阶段先是在末尾添加一个空字符'\0',然后用于初始化一个不可见的静态数组。最后,C的实现用这个数组的内容初始化数组notes。
char * ptr;
ptr = notes;
这两句,数组notes自动转换为指向其第一个元素的指针,并将这个指针赋给ptr。也就是说,ptr现在指向数组notes的首元素,也就是notes [0]。
puts(++ptr);
这一句,puts函数要求一个字符串。字符串是一个字符的序列,且以第一个遇到的空字符('\0')终止。字符串包括单字节字符的序列和多字节字符的序列,但应与宽字符的序列相区别。
不管怎么说,因为在传递给puts函数之前,表达式++ptr的效果是指向数组notes的第二个元素(notes [1]),所以输出的是
ee you at the snack bar.
notes[7]='\0';
这一句,将数组的7号元素修改为空字符'\0'。此时,数组notes的元素是
See you\0at the snack bar.
puts(++ptr);
这一句,在进入puts函数之前,表达式++ptr的效果是指向数组notes的第三个元素(notes [2]),我们知道,puts函数输出一个字符串,但是,因为前面已经在数组中加入一个空字符'\0',所以它指向的串,以入puts函数的输出实际上是
e you
以上的关键是搞清楚数组、指针和字符串这几个概念。再来看另一个例子:
char keywords [] = "if\0else\0switch\0while";
这是一个数组,从字符串的角度来看,它包含了4个字符串,可以这样输出它们:
puts (keywords);
puts (keywords + 3);
puts (keywords + 8);
puts (keywords + 15);
理解和讨论之前请先学会如何观察!
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
