网站建设思路方法,三库一平台个人信息查询系统,鹤壁企业网站建设,网站做桌面应用 iOS文章目录1 C语言中的单引号和双引号1.1 双引号带来的BUG2 总结1 C语言中的单引号和双引号
C语言中的单引号用来表示字符字面量C语言中的双引号用来表示字符串字面量#xff0c;存储于全局的只读存储区 注意上面的字符与字符串的区别 下面的程序片段是否合法#xff1f; 上面… 文章目录1 C语言中的单引号和双引号1.1 双引号带来的BUG2 总结 1 C语言中的单引号和双引号
C语言中的单引号用来表示字符字面量C语言中的双引号用来表示字符串字面量存储于全局的只读存储区 注意上面的字符与字符串的区别 下面的程序片段是否合法 上面额三行代码看着像是很正常实际上问题很大。在具体分析上述代码问题之前我们先给出一个代码示例来看看
代码 14-1.c
#include stdio.hint main()
{char* p1 1 ;char* p2 1;char* p3 1;printf(%s, %s, %s, p1, p2, p3);printf(\n);printf(\n);return 0;
}上述代码编译结果如下 在程序员的眼中警告就是错误上述错误提示告诉我们6行7行12行有问题。 运行上述可执行程序的话会产生段错误
由以上的程序以及编译与运行的情况来看由以下几条知识点需要我们掌握
字符字面量被编译为对应的ASCII码字符串字面量被编译为对应的内存地址printf() 的第一个参数被当成是字符串的内存地址内存的低地址空间不能被随意访问。至于这一点如下内存图所示 如上图所示 p1变量的值是0x00000001地址1是无法访问的。所以第6行有警告 。 地址0x00000001为什么不能访问可以自行google p2变量的值是字符‘1’的ASCII码也就是31地址0x00000031也是不能被访问的。第一条与第二条就印证了内存低地址不能被访问的说法 p3变量的值是字符串“1” 所代表的地址在这里是0x080484d0 。 这个地址是可以被访问的。 至于第12行的警告是因为 ‘\n’ 的ASCII码值为 10 那么printf 的第一个参数就是 10 10这个地址同样也是不能被访问到的。
1.1 双引号带来的BUG
代码14-2.c
#include stdio.hint main()
{char c ;while( (c \t) || (c ) || (c \n) ){scanf(%c, c);}return 0;
}上述代码乍一看没问题但是编译运行会发现有警告且运行后并不会执行while循环。主要原因是双引号下空格表示一个地址的值。一个地址值是占用4字节的但是字符c是一字节的会产生截断因为截断了。所以while循环不会成立
2 总结
单引号括起来的单个字符代表整数双引号括起来的字符代表字符指针如果使用字符串对字符赋值就会得到错误的结果