CS50中char*与string的概念及代码实现疑问咨询
C语言字符串相关疑问解答
问题1:char* s = "HI!";到底创建了什么?
这段代码会完成两个操作:
- 程序在只读数据段中生成一个长度为4的字符数组,里面依次存放
'H'、'I'、'!'、'\0'(字符串结束标志); - 定义一个
char*类型的指针变量s,并把上述字符数组首元素'H'的地址赋值给它。
说白了就是两者兼具:既有存储字符串的只读数组,又有指向该数组的指针。另外要提醒一句,这个字符串是只读的,别尝试通过s修改它的内容(比如写s[0] = 'h'),这会触发未定义行为,大概率导致程序崩溃。
问题2:为什么printf("%c %c\n", *(name + 1), *name + 1);输出E C而非E E?
核心原因是运算符优先级与结合性,拆解两个参数就能明白:
- 第一个参数
*(name + 1):name指向字符串"BEN"的首字符'B',name + 1是向后偏移一个字节的地址,指向第二个字符'E',解引用后直接得到字符'E',所以第一个%c输出E。 - 第二个参数
*name + 1:*和+的优先级相同,但遵循左结合规则,所以先执行*name得到字符'B'(对应ASCII码66),再给这个数值加1得到67——对应的ASCII字符是'C',所以第二个%c输出C。
如果想让第二个参数也输出E,需要加括号强制改变运算顺序,写成*(name + 1)。
内容的提问来源于stack exchange,提问作者King Brain
相关产品推荐
相关产品推荐

