【问题标题】:typedef string c value assignment to positiontypedef string c 赋值给位置
【发布时间】:2018-05-28 22:29:36
【问题描述】:

我在 C 中使用 typedef 如下:

typedef char string[20];

然后我创建了一个名为“writeElement”的函数,定义如下:

void writeElement(string * string, int position, char letter){
     string[position]=letter;
}

为什么会出现错误:

"赋值给数组类型的表达式"

我只是无法理解。

【问题讨论】:

  • 因为string[p]的类型是char[20]
  • 将数组隐藏在 typedef 后面通常是个坏主意,所以很混乱。考虑一些变体: typedef struct { char data[20]; } string_t;
  • 关于:typedef char string[20]; 这只是说,当源代码包含 "string[20]` 以将其替换为 char。这不是你想要做的。

标签: c arrays string variable-assignment typedef


【解决方案1】:

首先,这很糟糕:

string * string

因为你定义了一个与类型同名的变量。因此变量掩盖了类型的名称,这意味着您不能在该范围内使用该类型。

主要问题是变量string 的类型为string *,转换为char (*)[20],即指向数组的指针。所以string[position]有类型char [20],这是一个数组类型,不能赋值给数组。

把string变量的名字改成别的名字,把它的类型改成string:

void writeElement(string my_string, int position, char letter){
     my_string[position]=letter;
}

由于将数组传递给函数与传递指向其第一个元素的指针相同,因此您可以通过数组元素运算符 [] 取消对指针的引用,以便结果在函数外部可见。

这是一个示例,说明为什么在 typedef 后面隐藏指针或数组不是一个好主意。它会导致混淆实际类型是什么。

【讨论】:

    【解决方案2】:

    这里,string type 是 char [20] 类型,一个数组类型。数组类型的变量,不能被赋值,状态是设计的。

    在这种情况下,变量string 是指向string 类型的指针,它是指向char[20] 类型的指针(准确地说是char (*) [20])。因此,string[p] 本质上属于char [20] 类型,因此无法用于赋值运算符的 LHS 操作数。

    据我所知,首先,您不需要函数参数是指针。只需将其设为string 类型(请选择与类型不同的变量名),然后对其进行索引。

    此外,如有疑问,请检查数据类型。在作业的 RHS 上,您的类型为 char,因此 LHS 也应该是相同的类型。

    【讨论】:

    • 感谢您的回复。那么如何在作为引用传递的字符串的“位置”中插入“字母”呢?
    • 修复writeElement(string str, int position, char letter),然后修复str[position]=letter;
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2013-07-13
    • 2018-04-04
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多