[C++基础]指针和引用


指针,引用,引用变量,引用做参数和返回值,指针和引用的区别

指针

new

申请指针空间
申请单个空间的时候,可以直接初始化

但是申请数组时,可以使用memset赋值

delete

释放指针

在释放数组时,要加方括号

#include <iostream>
using namespace std;
int main()
{

////申请单个空间
//int *p = new int;//new+type 类型匹配上 也可以直接初始化 new int(12)
//int *p1=malloc(sizeof(int));c语言!
//char *p = new char;
//*p = 12;//写
//cout << *p << endl;//读
//delete p;//释放
//申请数组
int *p = new int[5];
memset(p,0,5*4)//赋值数组,5个值,每个int占4个字节,总共20个字节
//int *p1 = malloc(5 * 4); c语言
p[0] = 12;
p[1] = 11;
cout << p[0] << "  " << p[1] << endl;
system("pause");
delete[]p;//释放数组P 要方括号
return 0;

}

*作用

1 在申明一个变量的时候,*指针变量

2 地址操作符 读写

3 数字 表示乘法

对内存的操作

读 写 取地址&

引用

给变量取别名

int a=12;
int &c=a;//声明变量a的一个引用c,c时变量a的一个别名
c=13//a的值也改变了 

引用的时候一定要初始化

可以被多个变量引用

与赋值概念不同

指针

这个和指针不同

*p=&a;

p指向的是a的地址,而不是a本身

但是取别名的话,直接关联本身
avatar

其他类型的引用

常量的引用

const int& a = 12;

不可以修改a的值,只能读

数组的引用

1 一维数组:

int ar[12];
int (&p)[12]=ar;//引用 类型

2 二维数组

int arr[2][3];
int (&p)[2][3]=arr;

指针的引用

int b=12;
int *p=&b;
int *(&p1)=p;

引用做参数

void fun(int& a)
{
    a=13;
    count<<a<<endl;
}
void fun1(int a)
{
    a=14;
    coutn<<a<<endl;
}
void fun2(int* a)
{
    *a=15;
}
int main()
{
    int b=12;
    fun(b);
    fun1(b);
    fun2(&b);
    return 0;

}

1.调用fun函数时,a初始化成b,a和b关联同一个空间,在函数fun里给a赋值,调用时,b的值也改变成和a一样

avatar

2.调用fun1函数时,把b赋值给了a,给a的空间传递了一个b的值,fun1函数里面a赋值,并不会改变b

avatar

3.c语言中,通过调用指针改变外部的值,如图:avatar

(引用)交换两个变量的值

void exchange(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}

不引用直接传入无法改变

指针传入也可以改变两个变量的值

void exchange(int*a,int*b)
{
int *temp=*a;
*a=*b;
*b=*temp;
}

引用做返回值

int& fun()
{
    int a=12;
    return a;
}
int main()
{
    int& b=fun();
    cout<<b<<endl;
    system("pause");
    return 0;
}

第九行调用了局部变量后,a的内容空间销毁,第十行是非法空间操作!!不要引用局部变量

引用不占存储空间,指针占空间

&作用:

1.变量前加 做引用

2.取地址

3.与运算

引用做参数

void fun(int& a)
{
    a=13;
    count<<a<<endl;
}
void fun1(int a)
{
    a=14;
    coutn<<a<<endl;
}
void fun2(int* a)
{
*a=15;
}
int main()
{
    int b=12;
    fun(b);
    fun1(b);
    fun2(&b);
    return 0;

}

1.调用fun函数时,a初始化成b,a和b关联同一个空间,在函数fun里给a赋值,调用时,b的值也改变成和a一样

avatar

2.调用fun1函数时,把b赋值给了a,给a的空间传递了一个b的值,fun1函数里面a赋值,并不会改变b

avatar

3.c语言中,通过调用指针改变外部的值,如图:avatar

(引用)交换两个变量的值

void exchange(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}

不引用直接传入无法改变

指针传入也可以改变两个变量的值

void exchange(int*a,int*b)
{
int *temp=*a;
*a=*b;
*b=*temp;
}

引用

引用只是别名,不是实体类型(也就是说c++编译器不为引用单独分配内存空间),对一个对象的引用,就是直接对这个对象的操作。

(1)引用必须初始化(引用必须指向所引用的对象)

int a = 3;<br>
int& ra = a;<br>
int &b ;//错误,引用必须初始化

(3)引用不能更换目标

   int& ra = a;
// int& ra = b;//错误,多次初始化

引用的使用场合?

(一)引用型参数(函数形参只是实参的别名,也就是说形参和实参是同一个对象)

使用引用型参数有两个好处:

(1)因为函数形参和实参是同一个对象,也就不存在对象复制,避免了对象的开销。
(2)可以在修改形参的同时对实参的修改。

因为不存在拷贝构造所以,可以提高c++程序的执行效率

(2)引用型返回值

从函数中返回引用,一定要保证在函数返回以后,被引用的目标一直有效,也就是不能返回函数体内的局部对象的引用,局部对象离开作用域就会被析构掉,所以不能返回对函数体内的局部对象的引用。

区别和联系

指针可以不初始化,可以改变它指向的目标。