【问题标题】:Why is there no '&' when assigning a string to a character array in C? [duplicate]为什么在C中将字符串分配给字符数组时没有'&'? [复制]
【发布时间】:2019-09-22 20:51:38
【问题描述】:

我正在学习 C 类介绍,我想知道:为什么在 C 中将字符串分配给字符数组时不需要与号 (&)?

例如,我了解到char name[10]; scanf("%s", name);将字符串分配给字符数组。但是,我们了解到,变量的输入赋值类似于 scanf("%d", &intVariable);

为什么scanf 语句不是scanf("%s", &name);

【问题讨论】:

  • 一个字符串已经是一个指针,它的内容可以被访问。

标签: c pointers memory


【解决方案1】:

scanf 中的转换规范 %s 需要 char * 类型的参数。变量 name 的类型为 char []char 的数组)。
在 C 中,当作为参数传递给函数时,数组名称转换为指向其第一个元素的指针。所以name在传递给scanf时已经转换为char *类型,你不需要在它前面加上&。将& 放在name 之前将给出数组本身的地址,即它的类型将是指向char 数组的指针 (char (*)[])。 指向char的指针和指向char数组的指针都是不同的类型,因此不兼容。

【讨论】:

  • 如果您能给出拒绝投票的理由,我们将不胜感激?
  • 虽然这完全正确,但它并不能解释为什么给出数组的地址是错误的。除其他外,它是相同的地址,对吗?在 C++ 中,我们可能定义一个模板函数,它将地址(或引用)传递给 array,对吧?为了避免这些讨厌的越界写入,对吧?
  • 它确实回答了原因。 是同一个地址,对吗?:是的,但这并不意味着它们具有相同的类型。 在 C++ 中,我们可能会定义一个模板函数,它将地址(或引用)指向一个数组,对吧?C 不是 C++为了避免这些讨厌的越界写入,对吧?:这个问题的越界。
  • 好吧,你没有解释为什么一个指针比另一个更好,对吧?提示:您的答案不包含“因为”。当然,C 不是 C++,但即使在 C 中,[] 运算符也知道并需要其操作数的大小,那么为什么 C 不在 scanf 中获取整个数组地址呢? (提示:因为它不是核心语言的一部分,而是一个库函数,并且很可能最初不是内在函数,并且因为该语言的类型系统并非旨在处理它,因此 C++ 比较)等等。简单地说“将给出数组本身的地址”并没有解释为什么会出错。
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2019-02-25
相关资源
最近更新 更多