字符指针数组元素是指针,为何printf用%s输出字符串而非对应地址?
原因说明
你观察的没错:name[0]确实是char*类型的指针,存储的是字符串字面量"January"首字符的内存地址,最终输出内容是字符串而不是地址,完全是printf格式说明符的规则决定的:
printf的行为完全由你传入的格式符控制:当你使用%s格式符时,printf会将对应位置的参数默认当作char*类型处理,从该指针指向的内存地址开始逐字节读取字符,直到读到字符串终止符\0为止,将路径上的所有字符拼接输出,自然就得到了完整的字符串内容。- 如果你确实想要输出
name[0]存储的地址值,需要改用%p格式符,同时最好把指针强转为void*类型适配格式符要求,写法为:printf("%p", (void*)name[0]);。
你可以运行如下代码直观看到两种格式符的差异:
static char *name[] = { "January", "February", "March", }; // 输出字符串内容 printf("输出内容:%s\n", name[0]); // 输出字符串的首内存地址 printf("对应地址:%p\n", (void*)name[0]);
内容的提问来源于stack exchange,提问作者Haznut
相关产品推荐
相关产品推荐

