首先要知道指针作为一种变量类型,和所有变量类型一样,它自己占用一块内存空间,并且可以存放一个值(这个值往往是一个地址)
例子:
*p=0XX001
//0XX001只是p这个变量存放的值,p指针自己也有一个内存空间0XX101
**为什么我说函数都是值传递?**直接上代码
#include <stdio.h>
void swap(int *Pa,int *Pb){
//
int *Pswapper;
//在这里我们交换一下指针Pa和Pb的值
Pswapper=Pa;
Pa=Pb;
Pb=Pswapper;
printf("输出结果a=%d,b=%d",*Pa,*Pb);
//输出结果为*Pa=444,*Pb=222
}
int main()
{
int a=222;
int b=444;
int *Pa=&a;
int *Pb=&b;
swap(Pa,Pb);
printf("输出结果a=%d,b=%d",*Pa,*Pb);
//输出结果为*Pa=222,*Pb=444,没有改变
return 0;
}
输出结果a=222,b=444
可以看到,我让指针Pa,Pb作为swap函数参数,将Pa和Pb的值进行交换,出了函数后,结果没发生任何改变。
可见指针作为参数只是值传递而已。
然后有人说,那引用类型呢?
#include<iostream>
using namespace std;
void swip(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 222, b = 444;
swip(a, b);
cout << "a = " << a << "b = " << b <<endl;
return 0;
//输出结果:a=444,b=222,发生了交换
}
乍一看,完成了所谓的引用传递,可什么是引用呢?
https://blog.csdn.net/cherisegege/article/details/80470000?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-80470000-blog-88676471.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3#commentBox
引用的低层原理就是做了如下限制的指针:
1.必须初始化且只能赋值一次
2.无法访问引用的地址,默认访问所赋值变量的地址
总之,观察一下这三种参数传递的定义和调用
int a=xxx;
int b=xxx;
void swap(int parameter_a,int parameter_b) => swap(a,b)
void swap(int *parameter_a,int *parameter_b) => swap(&a,&b)
void swap(int ¶meter_a,int ¶meter_b) => swap(a,b)
其实就是
int parameter_a=a
int *parameter_a=&a
int ¶meter_a=a
所以何必区分引用传递和参数传递
不管什么传递,实质都只是在中间加了个"="。
而“=”是赋值操作。