【问题标题】:C++ - pointer function parameterC++ - 指针函数参数
【发布时间】:2011-01-23 10:26:47
【问题描述】:

我在这里问了一个问题:C++ - class issue

我仍然没有得到的是 pointer 参数:

void setInfo(char *strName,int id,double wage)

在哪里调用它:

abder.setInfo("Abder-Rahman",123,400);

我知道数组的名字是一个指针。但是,为什么我们必须有一个指针数据类型呢?我们不能在函数参数列表中使用char[] 吗?因为我认为我在尝试时遇到了错误。

谢谢。

【问题讨论】:

标签: c++ arrays pointers


【解决方案1】:

但是,为什么我们必须有一个指针数据类型呢?

因为在编译函数时需要知道函数参数的大小。 IE。该函数需要知道在内存中的参数列表多远才能找到idwage

我们不能在函数参数列表中使用 char[] 吗?

是的,你可以,但它仍然是通过指针传递的。数据作为数组的一部分所具有的任何其他属性(例如 sizeof() 返回数组的总大小)都不会保留在被调用的函数中。在函数签名中使用[] 的能力只是表明传递的项目应该是某种类型的数组(而不是指向结构的指针)。

【讨论】:

  • 感谢您的回复。当我尝试在这样的函数签名中使用 [] 时:“char[] strName”出现错误。我应该如何将其写为参数?谢谢。
  • @SWEngineer:“一个错误”非常“具体”:) 实际的错误信息是什么?另外,它应该是char strName[] 而不是char[] strName :)
【解决方案2】:

供参考,来自 C++03 标准,§ 8.3.53:

确定每个参数的类型后,将“T的数组”或“返回T的函数”类型的任何参数分别调整为“指向T的指针”或“返回T的函数的指针”。

此外,使用[] 声明的数组是不完整的对象类型 (§ 8.3.4 1),尽管在声明函数参数时这不会导致问题,因为它将被转换为指针。

【讨论】:

  • 感谢您的回复。当我使用这样的参数时:“char[] strName”出现错误。我应该如何将其写为参数?谢谢。
  • @SWEngineer:C++ 不是 Java 不是 C# 不是 D。找一本像样的 C++ 书并学习。
  • @SWEngineer:标识符(如果有)必须位于括号之前。 § 8.3.4 1 演示了这一点,但您确实必须查看语法(direct-declarator、type-id 和 new-expression 非终端,以及它们归约和归约到它们的终端)以了解整个故事.不需要标识符的情况(例如new[]sizeoftypeid、强制转换、模板参数)不包括声明。并不是说你应该向标准学习。
【解决方案3】:

char[] 也是一个指针。是的,你可以使用它。

【讨论】:

  • 只能作为函数参数的声明,否则char[]是不完整的数组类型。
  • 真的。我自己不使用它,我更喜欢 * :)
【解决方案4】:

数组和指针是非常相关的——你甚至可以像数组一样使用指针,比如

void foo(char *ptr) {
    ptr[2] = 'x';
}

在您的情况下,您会收到编译错误(或警告),因为字符串文字(如 "foo")被认为是 const,即它们可能不会被修改,并且因为不采用 const 指针的函数不会不承诺不改变它,编译器拒绝给它一个字符串字面量。

你需要做的

void setInfo(const char *strName,int id,double wage)

一般来说,除非您打算修改对象,否则您应该始终使用 const 作为指针和引用参数。

【讨论】:

  • 哇,我的帖子是双重否定的天堂。你不同意吗?
  • 不正确——由于 C++ 中的特定向后兼容性问题,您不会收到编译错误——即字符文字可以用作非const 函数参数(尽管函数不允许修改它们)。 (尽管大多数编译器会警告这种转换(即codepad.org/I8C2D9wq))
  • 我总是将警告编译为错误...对我来说,它们都是同一件事 :) 无论如何,写入字符串文字是未定义的行为,所以我会 非常 强烈建议人们不要省略const 如果无意修改字符串。
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多