在实现栈的时候注意到形参的形式有所不同,在此确认一下这三种形式的形参的区别。
以一个函数简要说明:
-
-
using namespace std;
-
-
struct stack{
-
int data[ 10];
-
}s;
-
void use_quote(stack &s)
-
{
-
s.data[ 0]= 2;
-
}
-
void use_direct(stack s)
-
{
-
s.data[ 1]= 4;
-
}
-
void use_point(stack *s)
-
{
-
s->data[ 2]= 6;
-
}
-
-
-
int main()
-
{
-
use_quote(s);
-
use_direct(s);
-
use_point(&s);
-
cout<<s.data[ 0]<< "==="<<s.data[ 1]<< "==="<<s.data[ 2];
-
getchar();
-
}
可见,除了stack s这种形式外,其余两种均可以实现对数据进行修改的操作。这一点是意料之中的。
——————————————————————————————————————————————————————————————
而在数组的使用中,函数的形参可以直接写int a[],同时也能对数组元素的值进行修改:
-
void use_direct(int a[])
-
{
-
a[ 1]= 4;
-
}
我想这是因为对于数组这种结构,把它传递到函数中,本来传递的就是首地址,因此int *a和int a[]这两种方式作为形参的结果是一样的。
———————————————————————————————————————————————————————————————
扫描二维码关注公众号,回复:
3219342 查看本文章
回到stack s,s是一个stack类型的变量,这和调用使用指针的swap函数是一个道理。
关于&S和*S,它们的原理目前我觉得没有什么差别,&S和*S做形参,希望传递的都是S的地址。
不过&S这种方式,在调用函数时,可以直接
use_quote(s);
因为函数体会对S做一次取地址操作。
而*S则需要这样:
use_point(&s);
因为struct *S要求传入一个地址
以上仅作为一个小结,对于地址、指针的使用已经基本明白。
——————————————————————————————————————————————————————————
当然还有一种形式,不妨一起写在这里。
int &a=b;
a是b的引用,使用是一样的。