文章目录:
善于使用指针和引用
指针
1.1 什么是指针
首先,在弄清楚什么是指针之前,务必要知道时数据在内存中是如何存储的
- 如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据定义的变量类型,分配一定长度的空间。例如:c++编译系统一般为整型变量分配4个字节。内存区的每个字节有一个编号,这就是地址。
- 程序经过编译以后已经将变量名转换为变量的地址,对变量值得存取都是通过地址进行的。例如:语句"cout<< i;"的执行是这样的:根据变量名与地址的对应关系,找到变量i的地址2000,然后从由2000开始的4个字节中取出数据(即变量的值3),把它输出。这种按变量地址存取变量值的方式称为直接存取方式,或直接访问方式。
- 还可以定义这样一个特殊的变量,专门用它来存放地址。这样把变量i的地址存放在变量中,这个变量称为指针变量,一个变量的地址称为该变量的指针
1.2 变量与指针
变量的指针就是变量的地址,用来存放变量地址的变量就是指针变量。 如果i_pointer是一个指针变量,而*i_pointer表示i_pointer所指向的变量。
1.2.1定义指针变量
int i,j;
int *pointer_1,*pointer_2;
第二行所定义的指针变量是指向整型数据的指针变量(pointer_1和pointer_2只能存放整型数据的地址。int为指针变量的基类型)
- 所以定义指针变量的一般形式为:
基类型 * 指针变量名 - 那么怎样使一个指针变量指向另一个变量?只需要把被指向的变量的地址赋值给指针变量即可。例如:pointer_1=&i;
&是取地址运算符, &i是变量i的地址,执行该语句后pointer_1的值就是变量i所占存储单元的起始地址
1.2.2引用指针变量
首先,有两个与指针变量有关的运算符:
(1)&:取地址运算符
(2)*:指针运算符(间接访问运算符)
&*pointer_1和 *&a的含义?(假设已经执行了"pointer_1=&a;")答案:前者为a的地址,后者为a本身。
#include<iostream>
using namespace std;
int main()
{
int *p1,*p2,*p,a,b;
cin>>a>>b;
p1 = &a;
p2 = &b;
if(a < b){
p = p1;
p1 = p2;
p2 = p;
}
cout<<"a ="<<a<<"b = "<<b<<endl;
cout<<"max = "<<*p1<<"min = "<<p2<<endl;
return 0;
}
运行结果:a = 45 b = 48
max = 78 min = 45
这个问题的算法是不交换整型变量的值,而是交换两个指针变量的值。
如下图所示:
1.2.3 用指针做函数参数
如果一个函数的参数是指针类型,它的作用是将一个变量的地址传送给被调用函数的形参。
- 例子同上例
//交换a和b的值
#include <iostream>
using namespace std;
int main()
{
void swap(int *p1,int *p2); //函数声明
int *pointer_1, *pointer_2,a,b;
cin>>a>>b;
pointer_1 = &a;
pointer_2 = &b;
if(a < b)swap(pointer_1,pointer_2);//如果a<b,使*pointer_1和*pointer_2互换
cout<<"max = "<<a<<"min = "<<b&