【发布时间】:2016-03-17 09:44:54
【问题描述】:
int aryint[4] = {1,2,3,4};
char *ptr = "1234";
char ch ='a';
char *chptr = &ch;
//chptr = 3509449623 (mem addr)
printf("chptr = %u, chptr);
//aryint = 3509449648 (mem addr)
printf("aryint = %u ", aryint);
//ptr = 1234
printf("ptr = %s, ptr);
为什么打印出一个字符点“ptr”会返回整个char数组(整个字符串),而打印出一个字符点“chptr”会返回“chptr”的mem addr?
如果这是因为“ptr”指向一个数组,那么为什么打印出数组“aryint”只返回aryint的mem addr(而不是整个数组)? 所以打印出整个数组只适用于字符串常量?还是因为 %s?
但是当我尝试在 ptr 的 printf() 上用 %u 替换 %s 时,我也得到了一个常量 (4197008),它相当于整个数组/字符串 (1234),而不是内存地址:
//ptr u = 4197008 (a constant not mem addr), ptr s = 1234,
printf("ptr u = %u, ptr s = %s”, ptr, ptr)
但是,当我尝试打印 char 数组“str”时,当我在“str”上应用 %u(而不是 ptr 中的整个数组)时,我得到了 mem 地址。但是当 %s 应用于“str”时,我再次打印了整个数组,而不是之前在 chptr 和 aryint 中的内存地址。
char str[5] = "1234";
//str u = 3509449696 (mem addr), str s = 1234
printf("str u = %u, str s =%s”, str, str );
这对我来说似乎有点奇怪。在用 C 编码时,我还应该注意什么其他奇怪的现象?我是新手。
任何帮助将不胜感激!
【问题讨论】:
-
打印指针使用
%p,而不是%u。使用错误的格式说明符会调用未定义的行为 -
因为 %s 打印整个数组,而所有其他格式说明符只打印一个项目。这就是它的全部内容。
-
'ptr' 上的 %u 也是如此。
标签: c arrays string pointers char