我在这里问了一个问题:C++ - class issue
我还没有得到的是指针参数:
void setInfo(char *strName,int id,double wage)
通过以下方式调用:
abder.setInfo("Abder-Rahman",123,400);
我知道数组的名称是指针。但是,为什么我们必须有一个指针数据类型?我们不能在函数参数列表中使用char[]
吗?我认为当我尝试时出现错误。
感谢。
答案 0 :(得分:3)
但是,为什么我们必须有一个指针数据类型?
因为在编译函数时需要知道函数参数的大小。即该函数需要知道内存中参数列表的距离,以便找到id
和wage
。
我们不能在函数参数列表中使用char []吗?
是的,你可以,但仍然通过指针传递。数据作为数组的一部分的其他属性(例如sizeof()
返回数组的总大小)都不会保留在被调用函数内。在函数签名中使用[]
的能力只是指示您传递的项应该是某种类型的数组(而不是指向结构的指针)。
答案 1 :(得分:2)
供参考,来自C ++ 03标准,§ 8.3.5 3:
在确定每个参数的类型后,任何类型为“T of T”或“函数返回T”的参数都将被调整为“指向T的指针”或“指向函数返回T的指针”。
此外,使用[]
声明的数组是不完整的对象类型(§ 8.3.4 1),但这在声明函数参数时不会导致问题,因为它将转换为指针。
答案 2 :(得分:1)
char []也是一个指针。是的,你可以使用它。
答案 3 :(得分:1)
数组和指针非常相关 - 你甚至可以使用像数组一样的指针,比如
void foo(char *ptr) {
ptr[2] = 'x';
}
在你的情况下,你得到一个编译错误(或警告),因为字符串文字(如"foo"
)被认为是const,即它们可能不会被修改,并且因为一个函数没有采用const指针不承诺不改变它,编译器拒绝将其作为字符串文字。
你需要做
void setInfo(const char *strName,int id,double wage)
通常,除非您计划修改对象,否则应始终使用const
作为指针和引用参数。