各种符号(*,&等)与参数组合的区别是什么?
可能重复:
c ++ * vs&在函数声明中
我知道这对你们中的许多人来说似乎是一个非常基本的问题,但尽pipe我的search量最好,但我真的有一个不可能的时间find一个好的,彻底的解释。 我确定答案是在那里,所以我的search条件必须是可怕的。
在C ++中,使用各种符号及其组合来标记参数(以及这些参数的参数)。 究竟是什么意思呢?
例如: void func(int *var)
和void func(int **var)
什么区别? 那么int &var
呢?
同样的问题代表了返回types以及参数。 与int* func(int var)
相比, int& func(int var)
是什么意思? 在参数中, y = func(*x)
与y = func(&x)
什么不同?
如果只有你能指出我正确的方向,我很乐意阅读有关这一主题的大量文章。 另外,我非常熟悉一般的编程概念:OO,generics/模板等,而不是C / C ++中使用的符号。
编辑:看来我可能给人的印象是我不知道什么是指针。 我不知道这可能是:)
所以澄清:我完全理解指针如何工作。 我不是在抓, 而是很奇怪的找不到答案,就是例如'void func(int&var)'的含义。 在赋值语句的情况下,'&'运算符将在右侧,如'int * x =&y;',但是在上面,'&'运算符实际上在左侧。 换句话说,它是运行在l值上,而不是r值。 这显然不能有相同的意思。
我希望我现在更有意义?
要理解这个,你首先需要理解指针和引用。 我将简单地解释你所要求的types声明语法,假设你已经知道指针和引用是什么。
在C中,types声明遵循'声明遵循使用'风格。 这意味着通常在一个声明中你将有一个基types和一个expression式来评估这个基types。 因此, int *y
声明在另一个expression式中使用的*y
将是一个int。 这意味着y
是一个指向int的指针。 对于函数参数也是如此,实际上对于整个函数声明也是如此:
int *foo(int **bar);
在上面的int **bar
, **bar
是一个int,暗示*bar
是一个指向int的指针, bar
是一个指向int的指针。 它还声明了*foo(arg)
将是一个int(给定的arg
是合适的types),这意味着foo(arg)
产生一个指向int的指针。因此,整个函数声明显示“foo是一个函数,指向指向int的指针,并返回指向int的指针。
C ++增加了引用的概念,并在这个过程中稍微混淆了C风格的声明。 因为使用address-of运算符来取得一个variables的地址并且必须产生一个指针,所以C对于在声明中没有任何用处; int &x
意味着&x
是一个int,意味着x
是某种types的地址,因为这个types的地址是int.²所以,因为这个语法没有被使用,所以C ++将它用于完全不同的目的。
在C ++中, int &x
表示x
是对int的引用。 使用variables不涉及任何操作符对引用进行“取消引用”,因此引用声明符号与操作符地址冲突并不重要。 相同的符号在两种情况下意味着完全不同的事物,并且从不需要在允许另一种意义的情况下使用一种意义。
所以char &foo(int &a)
声明了一个函数,它接受一个int的引用并返回一个char的引用。 func(&x)
是一个expression式,将x
的地址传递给func
。
1.事实上,在原来的用于声明函数声明的C语法中,“使用”更加严格。 例如,你需要声明一个函数为int foo(a,b)
并且在其他地方声明了参数的types,这样声明看起来就像一个use,没有额外的typenames。
2.当然int *&x;
可能是有道理的, *&x
可能是一个整数,但C实际上并没有这样做。
你在问什么叫做指针( *
)和引用( &
),我认为这里最好解释一下 。
在C ++中,符号*
和&
具有三个含义:
-
正如你所知道的,当应用于expression式时,它们分别表示“取消引用”和“地址 – ”。
-
当一个types的部分,它们分别是指“指针”和“参考”。
由于C ++不关心任意间距,因此声明
int *ptr
与声明int *ptr
完全相同,现在您可以更清楚地看到这是一个名为ptr
types为int*
的对象。 1 -
在两个expression式之间使用时,分别表示“乘”和“逐位”。
1 – 但令人沮丧的是,这实际上并不是内部语法读取它的原因,这要归功于Ctypes系统的令人讨厌的遗产。 所以避免涉及指针的单行多重声明,除非你想要一个惊喜。
例如:'void func(int * var)'和'void func(int ** var)'之间有什么区别? 那么'int&var'呢?
同样的问题代表了返回types以及参数。 与'int * func(int var)'相比,'int&func(int var)'的意思是什么? 在参数中,'y = func(* x)'与'y = func(&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; }
符号&和*分别用来表示引用和指针types。
int
表示简单的types'int', int*
表示'int指针', int&
表示'引用int',
指针是一个用来存储variables地址的variables。 引用具有其基本types的语法,但指向该types的指针的语义。 这意味着你不需要取消引用它来改变它的值。
举一个例子,下面的代码块2在语义上是等价的:
int* a = &value; *a = 0;
和:
int& a = value; a = 0;
使用指针或引用作为参数types的主要原因是为了避免复制对象并能够改变传递参数的值。 这两个工作,因为,当你通过引用传递时,只有地址被复制,让您访问到“传递”的function相同的内存位置。
相反,如果不使用引用或指针types,则会创build完整的参数副本,并且该副本在函数内部可用。