【问题标题】:Are passing char array by (char* ar) and (char ar[ ]) same? c++ [duplicate]通过 (char* ar) 和 (char ar[ ]) 传递 char 数组是否相同? C++ [重复]
【发布时间】:2016-11-02 17:22:13
【问题描述】:

我是 C++ 新手,我需要帮助,因为如果我认为不同的两种方式实际上是同一件事,我会感到有点困惑。 所以这是我将字符数组传递给函数的代码。

     // This is the first style I use
   void functionPTR( char *ptr ) // Pass by reference 
               {
                     // just put up some random code
                 strcpy(ptr,"BY_POINTER"); 
                 cout<<ptr[0]; // random thing
                }

// This is the Second style I use
   void functionVAL( char val[] ) // Pass by value
                 {
                  ... code here
                }

这是我的困惑。 我一直认为第一个基本上是通过引用传递,函数中变量的任何更改都会改变原始传递的变量,并认为第二个是传统的按值传递方式,函数创建自己的值并使用它来修改哪个不影响原始传递的变量。

但这里的事情并不如我所愿。在这两种情况下,函数对变量所做的任何更改都会反映在原始传递的变量中。
谁能解释一下这件事实际上是如何工作的。请不要对我苛刻,因为我仍在自学。

感谢您过来阅读我的问题并帮助我。

【问题讨论】:

  • 在这种情况下,数组衰减为该类型的指针,因此两者完全相同。
  • 不不不不不不|贝茨说的是对的。
  • 所以基本上两者都做同样的事情,但只是表示方式不同,对吧?
  • 这个问题已经回答了here
  • 我完全不同意这个问题被标记为重复,因为它明确地解决了 C++,而另一个问题是关于 C。事实上,即使是公认的答案也指的是 C99 草案。 SO 的人们通常对 C 不是 C++ 非常挑剔(而且是正确的),所以我不明白为什么这应该是一个骗局。

标签: c++ arrays pointers char


【解决方案1】:

它们都完全相同相同。

当作为函数参数传递时,val衰减为指针类型:它的类型也是char*

两种情况下都不会对所采用的任何数组进行深拷贝。

是否使用val[i]ptr[i]*(val + i)*(ptr + i) 访问数组元素纯粹是个人喜好问题。

【讨论】:

  • @KushanMehta 在这两种情况下都会创建变量的副本,变量是一个指针,它被复制,而不是它指向的数据。
  • 哦,这帮助我彻底解决了我的疑问。万分感谢。将在 9 分钟内接受您的回答(时限)。
  • @KushanMehta 你是对的,变量没有被复制。相反,将单个指针传递给指向数组的函数。因此,在任一函数中,您都在使用 very same 数组。
  • @Slava 我得到了那个东西。那么指针和原始字符数组之间的内存是否真的存在差异。谢谢
  • @KushanMehta 你的问题没有多大意义。数组是内存区域,指针是地址。在C/C++中,数组名可以衰减到第一个元素的指针,但是数组和指针是不同的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多