指针式c系语言的特色。指针是C++提供的一种颇具特色的数据类型,允许直接获取和操纵数据地址,实现动态储存分配。一个数据对象的内存地址称为该数据对象的指针。指针可以表示各种数据对象,如简单的变量、数组、数组元素、结构体,甚至函数。
指针与引用的区别:
1、引用必须在声明前初始化,并且只能初始化一次,之后就不能改变了,而指针不用,并且可以改变。
2、初始化时引用必须指明一个对象,而指针的初始化是指向一个地址,可以为空。
3、引用一旦声明,引用的对象不能改变,而指针随时可以改变指向的对象。
5、指针是一个实体,而引用仅是个别名。
6、引用没有const,指针可以有const,const的指针不可变。
指针与引用的联系:
1、指针和引用都是通过地址实现的,可以说引用是指针的特殊一种
我们来看下面的例子:
int main(){
int a1; //正确, 很正常的声明了一个整形变量
int a2 = 10; //正确,很正常的声明了一个整形变量,同时初始化这个变量。
int a3 = 20; //正确,很正常的声明了一个整形变量,同时初始化这个变量。
int &b1; //错误,声明了一个引用,但引用不能为空,必须同时初始化。
int &b2 = a1; //正确,声明了一个引用b2,同时初始化了,b2为a1的别名。
int &b3 = a1; //正确,声明了一个引用b3,同时初始化了,b3为a1的别名。
int *p; //正确,声明了一个整数指针,但是并没有定义这个指针所指向的地址。
int *p = 5; //错误,整数指针p并没有指向实际的地址,在这种情况下就给他赋值是错误的,因为赋的值不知道放到哪里去,这样的指针称为野指针,会造成内存泄露。
p = &a3; //正确,整数指针p指向a1实际的地址。
const double c; //错误,const常量赋值时,必须同时初始化。
const double d = 10.0; //正确,const常量赋值并同时初始化。
const double e = 11.0; //
const double *q = &e; //正确,const常量指针赋值并同时初始化。
return o;
}
引用:int a = 10;
int &b = a ;
我们就说b是a的引用,也就是b是a的别名,b改变,a就自动改变。
在c++语言的函数的传参和返回值的传递方式有三种:值传递、指针(地址)传递、引用传递。
下面看三个例子:
例1、
void fun1(int p){
p = p + 1;
}
void main(){
int a = 10;
fun1(a);
printf("%d\n",a);
}
输出的结果为10,此例子采用的值传递,调用函数后a所在地址的值并没有改变,所以a值没有变。
例2、
void fun1(int *p){
*p = *p + 1;
}
void main(){
int a = 10;
fun1(&a);
printf("%d\n",a);
}
输出的结果为11;此例子采用的指针(地址)传递,调用函数后a所在地址的值发生改变,所以a的值也会变化。
例3、
void fun1(int &p){
p = p + 1;
}
void main(){
int a = 10;
fun1(a);
printf("%d\n",a);
}
输出的结果为11;此例子采用的引用传递,调用函数后,p相当于a的别名,当p改变后a的值也会跟着改变,所以a的值也会变化。