以下代码没有代码没有给出任何错误
#include<stdio.h>
main()
{
char c='c';
//*c='a';
printf("\n%c\n",c);
}
但是下面的代码给出了警告并且没有输出
#include<stdio.h>
main()
{
char *c='c';
//*c='a';
printf("\n%c\n",*c);
}
test.c:4:10: warning: initialization makes pointer from integer without a cast [enabled by default]
有人可以解释为什么会这样吗?
答案 0 :(得分:3)
为了理解正在发生的事情,有必要了解'c'
和"c"
文字(常量)之间的区别:
'c'
是一个数字常量,是写(char)99
的简写(假设是ASCII编码)"c"
表示双字符序列{'c', '\0'}
如果您使用"c"
代替'c'
,那么您的第二个代码段就可以了。您需要为char*
分配一个地址,"c"
会为您提供一个地址。但是,'c'
不是地址,它是一个数字常量。这就是你收到警告的原因。
当您取消引用常量'c'
重新解释为指针时,您会得到未定义的行为。这就是printf
不打印任何内容的原因。
答案 1 :(得分:1)
char *c='c';
//*c='a';
printf("\n%c\n",*c);
您尝试通过char *c;
指针是一个变量,它保存另一个变量的内存位置,所以
char *c='c';
没有任何意义 指针可以保持记忆位置的地址
答案 2 :(得分:0)
类型很重要。
在第一个代码段中,变量c
的类型为char
,这是一个整数类型。 表达式 'c'
的类型为int
,其值为用于字符的任何代码&#39; c&#39; (在ASCII中,它将是99)。 int
和char
类型兼容;假设该值可在目标类型中表示,则可以在不需要强制转换的情况下将其中一个分配给另一个。在这种情况下,'c'
的值可以在char
类型的对象中表示。
在第二个代码段中,c
的类型为char *
,这是指针类型。指针类型和整数类型不兼容,并且您无法在没有强制转换的情况下将一个指定给另一个,这就是您获得诊断的原因。 错误修复它的方法是
char *c = (char *) 'c';
取表达式'c'
(99)的值,将其转换为指针类型,并将结果指针值赋给c
。这是修复它的错误的方法,因为
结果指针值很可能不是有效地址。
你可能想要做的事情是
char *c = "c"; // note double quotes
expressiuon "c"
是一个字符串文字;它是包含值char
的{{1}}的2元素数组。在大多数情况下,{'c', 0 }
&#34;的类型为&#34; N元素数组的表达式将被转换(&#34;衰减&#34;)到类型为#34的表达式;指向T
&#34;的指针,并且表达式的值将是该表达式中第一个元素的地址阵列。因此,在上面的声明中,字符串文字T
的第一个字符的地址被分配给指针变量"c"
。