1.什么是指针
int *p = &a; //&:取地址
此时 *p = 10; // 因为p存储的是a的地址,所以p指向a,
2.什么是引用
引用是C++语言对C语言的一个重要补充,而C语言中是不包含“引用”的。
引用”; 它的作用是为变量起一个别名。引用和变量绑定在一起,对引用的操作与对其所绑定的变量或对象的操作完全等价。引用和变量是同一个地址,因此引用不分配内存地址,必须初始化,不能为空,且一旦初始化,引用的值不能改变,引用的内容可以改变。
int a = 10;
int &b = a;
b可以成为变量a的一个引用。
此时:b = 10;
&b = &a; //变量a与他的引用的地址一样
3.引用注意事项
1) 引用不是一种独立的数据类型,对引用只能声明,不能定义。 只能先定义一个变量,然后在声明对该变量的一个引用(起个别名)。
2) 不能建立数组的引用,包括建立对数组元素的引用。
3) 不能建立引用的引用, 也没有引用的指针。
4) 可以取引用的地址。 注意此时引用的地址等于变量的地址
int a = 10;
int &b = a;
int p = &b; // 等同于p = &a;
4.值传递和地址传递
1)C语言中可以说只有值传递。
func1(int a, int b);
func2(int *a, int *b);
// 实际调用过程中的形式:
{
int a, b;
... ...
func1(a, b);
func2(&a, &b);
}
这两个都属于值传递,只是传递的值不同而已:
第一个传递的是变量的值;
第二个传递的是变量的地址。
传递变量的值:无论函数中如何操作形参,都不会影响到实参变量的值;
传递变量的地址:无论函数中如何操作形参,会影响到实参变量的值,不会影响到实参变量的地址;但是可以改变这个地址里的值,也就是可以改变变量的值。但是我们传递的是变量的地址,从这个角度来看是和普通的值传递完全一致的。
2)C++中引入了地址传递
func3(int &a, int &b);
//实际调用中的形式:
{
int a ,b ;
... ...
func3(a ,b);
}
这才是严格意义上的地址传递,调用函数时使用的是变量,但是传递的却是变量的地址。
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,
不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过
栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
1.指针和引用的定义和性质区别:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
int a=0;
int b=&a;
int *p=&a;
b++;相当于a++;b只是a的一个别名,和a一样使用.
p++;后p指向a后面的内存
(*p)++;相当于a++
指针是对内存地址的自增
引用是对值的自增