首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将字符指针赋给字符变量?

如何将字符指针赋给字符变量?
EN

Stack Overflow用户
提问于 2014-02-12 04:50:53
回答 3查看 307关注 0票数 0

呼!我有以下代码:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    char t[10] = "John";
    char x = t;
    printf("%c\n", x);
    return 0;
}

编译器怎么能不在这里给我一个错误呢?而且,printf语句会输出不同的结果。分配给变量x的确切内容是什么?

EN

回答 3

Stack Overflow用户

发布于 2014-02-12 04:55:36

如果您编译时出现警告,您将收到以下投诉:

警告:默认情况下,初始化在不启用强制转换的情况下从指针生成整数

它不会导致编译失败的原因是因为在幕后发生了三件事:

  • 首先数组衰减为指针(数组和指针不同,但数组在必要时‘衰减’为指针),
  • 然后该指针被转换为整数,
  • 最后该整数被转换为char并赋值给x

从整数到字符的转换不是问题(而且这种情况一直在发生,因为C中的字符常量实际上是ints),但将指针转换为整数很少是程序员的意图,因此出现了警告。严格来说,这并不是错误的,但也不是很有意义。

因此,最后,printf将打印t的第一个元素的地址的剩余部分。

票数 2
EN

Stack Overflow用户

发布于 2014-02-12 05:04:41

在c中,指针是一个标量值,因此是一个char,也是一个int。标量基本上意味着它是一个数字。所有的标量都可以相加、相乘等。总有一种方法可以从一个标量转换成另一个标量。

当您执行char x = t;时,它会隐式地将指针t转换为一个字符。变量x将包含指针的8个最低有效位。

不同的编译器处理标量转换的方式不同。有时,它们需要您显式地将一个转换为另一个。例如,char x = (char)t;如果隐式强制转换导致精度损失,一些人会给你警告。(从int到char的转换可能会丢失精度,但从char到int的转换不会丢失精度)当您试图隐式转换任何内容时,一些编译器会给您一个错误。

收到的是错误还是警告取决于您的编译器和编译器的设置。尝试启用警告。

在gcc中,您可以通过将-Wall添加到编译命令来启用所有警告,也可以通过添加-Werror将所有警告转换为错误

票数 2
EN

Stack Overflow用户

发布于 2014-02-12 05:02:18

在C中,多数时候数组的名称表示指向其第一个元素的指针。将指针转换为整数当然是有效的,而且在C中,char只是一个整数,即使可能是不可靠的代码。无论如何,这里的gcc-4.8.2-7.fc19.x86_64告诉我:

代码语言:javascript
复制
$ gcc -c xxx.c 
xxx.c: In function ‘main’:
xxx.c:6:14: warning: initialization makes integer from pointer without a cast [enabled by default]
 char x = t;
          ^

而clang-3.3-4.fc19.x86_64:

代码语言:javascript
复制
$ clang -c xxx.c 
xxx.c:6:10: warning: incompatible pointer to integer conversion initializing
      'char' with an expression of type 'char [10]' [-Wint-conversion]
    char x = t;
         ^   ~
1 warning generated.

没有错误,但有可怕的警告。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21712736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档