各种符号(*,&等)与参数结合的区别是什么?

时间:2012-03-09 15:47:25

标签: c++ syntax notation

  

可能重复:
  c++ * vs & in function declaration

我知道这对许多人来说似乎是一个非常基本的问题,但我真的有一个不可能的时间找到一个好的,彻底的解释,尽管我最好的谷歌搜索。我确定答案就在那里,所以我的搜索条件一定很糟糕。

在C ++中,各种符号及其组合用于标记参数(以及这些参数的参数)。究竟是什么意思呢?

例如:void func(int *var)void func(int **var)之间有什么区别?那么int &var呢?

同样的问题代表返回类型以及参数。与int& func(int var)相比,int* func(int var)的含义是什么?在论证中,y = func(*x)y = func(&x)的区别如何?

如果你能指出我正确的方向,我非常乐意阅读关于这个主题的大量文章。另外,我对一般编程概念非常熟悉:OO,泛型/模板等,而不是C / C ++中使用的符号。

编辑:似乎我可能给人的印象是我不知道指针是什么。我想知道那是怎么回事:))

所以为了澄清:我完全理解指针是如何工作的。我抓住什么,奇怪地无法找到答案,是'void func(int& var)'的含义。在转让声明的情况下,'&'运算符位于右侧,如'int * x =& y;',但在上面,'&'操作员实际上在左侧。换句话说,它是在l值上运行,而不是在r值上运行。这显然不具有相同的含义。

我希望我现在更有意义了吗?

5 个答案:

答案 0 :(得分:8)

要理解这一点,首先需要了解指针和参考。我将简单解释一下你要问的类型声明语法,假设你已经知道了什么是指针和引用。

在C中,据说“声明随后使用”。这意味着使用变量声明变量模仿的语法:通常在声明中,您将拥有类似intfloat的基本类型,其后面的内容类似于表达式。例如,在int *y中,基本类型为int,表达式类似于*y。此后,该表达式将计算为具有给定基本类型的值。

所以int *y表示后来表达式*yint。这意味着y必须是指向int的指针。对于函数参数也是如此,事实上对于整个函数声明也是如此:

int *foo(int **bar);

在上面int **bar中说**bar是一个int,暗示*bar是指向int的指针,而bar是指向int的指针。它还声明*foo(arg)将是一个int(给定arg相应的类型),暗示foo(arg)导致指向int的指针.¹所以整个函数声明读取“foo”是一个函数,它指向指向int的指针,并返回指向int的指针。“

C ++添加了引用的概念,并在此过程中稍微混淆了C样式声明。因为使用address-of运算符&获取变量的地址必须产生指针,所以C在声明中对&没有任何用处; int &x意味着&x是一个int,意味着x是某种类型,其中该类型的地址导致int.²因此,由于此语法未被使用,C ++将其用于完全不同的目的。

在C ++中int &x表示x是对int的引用。使用该变量不涉及任何运算符“取消引用”引用,因此引用声明符号与address-of运算符冲突无关紧要。相同的符号在两个上下文中意味着完全不同的东西,并且在允许另一个上下文的上下文中从不需要使用一个含义。

所以char &foo(int &a)声明一个函数接受一个int的引用并返回一个char的引用。 func(&x)是一个表达式,其地址为x并将其传递给func


<子> 1。实际上,在用于声明函数声明的原始C语法中,遵循使用'甚至更严格地遵循。例如,你将一个函数声明为int foo(a,b),并且参数的类型在其他地方声明,因此声明看起来就像一个use,没有额外的类型名。

<子> 2。当然int *&x;可能有意义,因为*&x可能是一个int,但C实际上并不这样做。

答案 1 :(得分:4)

您所询问的内容称为指针(*),以及对&)的引用,我认为这是best explained here

答案 2 :(得分:2)

符号*&在C ++中各有三个含义:

  1. 当应用于表达式时,它们分别表示“取消引用”和“地址”,如您所知。

  2. 当类型的一部分时,它们分别表示“指针”和“引用”。

    由于C ++不关心任意间距,因此声明int *ptr与声明int* ptr完全相同,您可以在其中更清楚地看到这是一个名为{{1的对象类型为ptr 1

  3. 在两个表达式之间使用时,它们分别表示“乘法”和“按位AND”。


  4. 1 - 虽然令人沮丧,但实际上并不是内部语法如何读取它,这要归功于C类型系统的恶劣遗产。因此,除非您想要一个惊喜,否则请避免涉及指针的单行多声明。

答案 3 :(得分:2)

  

例如:'void func(int * var)'和'void之间的区别   func(int ** var)'?那么'int&amp; var'呢?

     

同样的问题代表返回类型以及参数。什么   'int&amp;与'int * func(int var)'相比,func(int var)'是什么意思?   在论证中,'y = func(* x)'与'y = func(&amp; x)'的区别是什么?

(1)
    <return type> <function name> <parameters> 
    void           func            (int *var) 

    <parameter> here int *var is a pointer to integer, ie it can point to 
    an array or any buffer that should be handled with integer pointer 
    arithmetic. In simple terms , var holds the address of the respective 
    **actual parameter.**

    eg: int arr[10]; 
        func(arr);

        int a = 33;
        func(&a);

        Here, &a means we are explicitly passing address of the the variable 'a'. 
 (2) 
     int m = 0; 
     int &var = m;

     Here var means reference, ie it another alias name for variable 'm' , 
     so any change 'var' makes will change the contents of variable 'm'.

     var = 2; /* will change the actual contents of 'm' */ 

     This simple example will not make sense , unless you understand the context. 
     Reference are usually use to pass parameter to function, so that changes made by 
     the function to the passed variable is visible at the caller.

     int swap(int &m, int &n) {
         tmp = m;
         m = n; 
         n = tmp; 
     }   

     void main( void ) {

        int x = 1, y = 2;
        swap(x, y);
        /* x = 2, y =1 */   

     }

(3) 
     'int& func(int var)' mean, as compared to 'int* func(int var)'?

      int& func(int var) means the function returns a reference; 
      int* func(int var) means the function returns a pointer / address; 

      Both of the them has its context; 


      int& setNext() {

            return next;   
      } 

      setNext() = previous; 


      where as 

      int* setNext() {

           return &next; 
      } 

      int *inptr;
      inptr = setNext(); 
      *inptr = previous;

      In the previous two lines, 

      int *inptr <- integer pointer declaration; 
      *inptr <- means we are accessing contents of the address pointed by inptr; 
      ie we are actually referring to 'next' variable. 

      The actual use is context specific. It can't be generalized.  

(4) 
    how does 'y = func(*x)' differ from 'y = func(&x)'?                           

     y = func(&x) is already explained. 

     y = func(*x) , well i'm not sure if you actually meant *x.


     int swap(int *m, int *n) {
         tmp = *m;
         *m = *n; 
         *n = tmp; 
     }   

答案 4 :(得分:1)

符号&amp;和*分别用于表示引用和指针类型。

int仅表示'int'类型, int*表示'指向int的指针', int&表示'引用int',

指针是一个变量,用于存储变量的地址。 引用具有其基类型的语法,但指向该类型的指针的语义。这意味着您无需取消引用它以更改值。

举一个例子,下面的代码块两个在语义上是等价的:

int* a = &value;
*a = 0;

int& a = value;
a = 0;

使用指针或引用作为参数类型的主要原因是避免复制对象并能够更改传递参数的值。这两个都有效,因为当您通过引用传递时,只复制地址,使您可以访问与“传递”到函数相同的内存位置。

相反,如果未使用引用或指针类型,则将生成参数的完整副本,并且该副本可在函数内部使用。