字符指针和C中的字符差异

时间:2014-08-06 17:03:49

标签: c gcc

以下代码没有代码没有给出任何错误

#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]

有人可以解释为什么会这样吗?

3 个答案:

答案 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;

声明指针c

指针是一个变量,它保存另一个变量的内存位置,所以

char *c='c';

没有任何意义 指针可以保持记忆位置的地址

答案 2 :(得分:0)

类型很重要。

在第一个代码段中,变量c的类型为char,这是一个整数类型。 表达式 'c'的类型为int,其值为用于字符的任何代码&#39; c&#39; (在ASCII中,它将是99)。 intchar类型兼容;假设该值可在目标类型中表示,则可以在不需要强制转换的情况下将其中一个分配给另一个。在这种情况下,'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"

相关问题