形参的不同格式

在实现栈的时候注意到形参的形式有所不同,在此确认一下这三种形式的形参的区别。

以一个函数简要说明:

  1. #include<iostream>
  2. using namespace std;
  3. struct stack{
  4. int data[ 10];
  5. }s;
  6. void use_quote(stack &s)
  7. {
  8. s.data[ 0]= 2;
  9. }
  10. void use_direct(stack s)
  11. {
  12. s.data[ 1]= 4;
  13. }
  14. void use_point(stack *s)
  15. {
  16. s->data[ 2]= 6;
  17. }
  18. int main()
  19. {
  20. use_quote(s);
  21. use_direct(s);
  22. use_point(&s);
  23. cout<<s.data[ 0]<< "==="<<s.data[ 1]<< "==="<<s.data[ 2];
  24. getchar();
  25. }
输出结果是2==0==6.

可见,除了stack s这种形式外,其余两种均可以实现对数据进行修改的操作。这一点是意料之中的。

——————————————————————————————————————————————————————————————

而在数组的使用中,函数的形参可以直接写int a[],同时也能对数组元素的值进行修改:

  1. void use_direct(int a[])
  2. {
  3. a[ 1]= 4;
  4. }

我想这是因为对于数组这种结构,把它传递到函数中,本来传递的就是首地址,因此int *a和int a[]这两种方式作为形参的结果是一样的。

———————————————————————————————————————————————————————————————

回到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的引用,使用是一样的。

猜你喜欢

转载自blog.csdn.net/weixin_40311211/article/details/81062167