【问题标题】:How can a char pointer be initialized with a string (Array of characters) but an int pointer not with an array of integer? [duplicate]如何用字符串(字符数组)初始化 char 指针,而不用整数数组初始化 int 指针? [复制]
【发布时间】:2016-06-27 12:59:18
【问题描述】:

char 指针如何用字符串(字符数组)初始化,但 int 指针不是用整数数组初始化?

当我尝试这个时

int* a={1,2,3,4,5};

它给出了一个错误提示

错误:标量对象“a”在初始化程序中需要一个元素

但是,

char* name="mikhil"

完美运行。

【问题讨论】:

  • 你可以这样做:int a[] = {1,2,3,4,5};
  • “但是 char* name="mikhil" 工作得很好” 不,它没有 - 它在 C++ 中是错误的并且不会编译。那么,我们是在谈论 C 还是 C++?

标签: c++ c arrays string pointers


【解决方案1】:

因为这些是语言的规则(标准)。没有什么告诉你可以用这样的数组来初始化一个指针,例如,下面的也是非法的:

char* name={'m', 'i', 'k', 'h', 'i', 'l', 0};

文字字符串有其自己的处理方式,并且不只是定义为字符数组。

【讨论】:

  • 您是对的,但这并不能回答这个特定问题。这里使用初始化器有一个基本的区别。
【解决方案2】:

如果您尝试用

初始化int *
  {1,2,3,4,5};

这是错误的,因为{1,2,3,4,5}; 按原样不是一个整数数组。它是一个大括号括起来的初始化器列表。这可用于初始化int 数组(具体来说,是数组的各个元素),但不能用于初始化指针。 数组不是指针,反之亦然。

但是,您可以使用compound literal 来初始化int *,例如

int * a = (int []){1,2,3,4,5};

【讨论】:

  • 这不是只适用于 C 而不是 C++
  • @KentKostelac 这是 c++ 中的 gcc(和 clang?)扩展,所以它不是标准的。看起来它也留下了一个悬空指针。
  • 您建议的方法给出错误“获取临时数组的地址”
【解决方案3】:

为方便起见,该语言允许使用字符串初始化 char *(或者,最好是 const char *)。这是因为它是一种非常常见的用法,并且从 C 开始就可以使用。您不应该真正修改字符串值(当然,这是一个单独的争论)。

对于一个 int,如果您初始化一个 int a[5],那么您可能会更改这些值。初始化的值将被复制到您的数组中(编译器优化无法承受),您可以根据自己的需要更改它们。如果允许 int *a 以这种方式初始化,它会指向什么?不是很清楚,所以标准不允许。

【讨论】:

    【解决方案4】:

    该语言不支持 int 数组的 null 终止符,这是因为编译器会有歧义,即 null 终止符或 int 数组中的 0...

    同样的原因

    cout<<anystring; 给出完整的字符数组,即完整的字符串 而这不

    cout<<a; 对于一维 int 数组 a...实际上它会给出错误消息并且不打印完整的一维数组...

    如果我在某处满意/解决了您的问题,请点赞...

    【讨论】:

    • '\0' 只是一个值0 的字符,可以提升为int。除此之外,我看不到空终止符如何适用于此。问题是{ 1, 2, 3} 不是数组。
    猜你喜欢
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多