指针的由来
首先我们要知道,一个内存单元由地址和内容两部分组成。
如上图,例如我们定义了一个变量a.
通过取地址运算符&(他的作用是求一个变量的地址),我们知道变量a的地址为0x6ffe1c,内容为5。
我们在访问变量a时,通常是直接访问,例如将a的值改为10,则直接执行a=10;
但是除了直接访问以外,我们可以用一种间接访问的方式来修改a的值。我们再另外定义一个变量p,专门用来存放a的地址,p的存放内容就是a的地址,当然p本身也有一个地址&p。然后我们再使用间接寻址运算符 *p(他的作用是返回操作数所指定地址的变量的值)来访问a的值,执行*p=10,也可以达到修改的目的。
我们这种用地址的方式来间接访问一个变量,用画图的形式来表示的话,一般用一个箭头从那个存放地址的变量指向这个真正要访问的变量【如图二的红色箭头】,因此指针由此生动的产生。一个变量的地址就是该变量的指针。
这些专门用来存放地址的变量具有一定的特殊性了,所以我们给他们一个新的名称:指针变量。
总结:
指针就是一个变量的地址,因为地址会指向这个变量,所以称其为指针。
指针变量是一个变量,专门用来存放变量的地址。
指针的定义
形式:基础变量类型 * 指针变量名;
例如上图的指针定义, int *p; 说明p是一个指针,并且指向整型类型,要达到访问a的目的,还需要进行赋值连接,即 p=&a;
也可以在定义是直接初始化: int *p=&a;
用指针作函数参数
1.函数的参数可以是整型、实型、字符型等等,也可以是指针类型。
2.这种地址传递(也叫指针传递)的方式可以实现通过调用函数使变量的值发生变化,并且在主调函数中使用这些改变了的值。
经典例题:交换两个数字
#include<iostream>
using namespace std;
void swap(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
int main(){
int x=5,y=6;
swap(&x,&y);
cout<<x<<" "<<y<<endl;
}
实参传入的是变量x,y的地址,形参的类型也是指针类型,他们接收了这个地址,现在指针变量a指向x,b指向y。
我们又定义了变量t,来交换*a和*b,也就是交换了x和y的值,实现了swap功能。
关于swap功能的实现还有很多种交换方式是不正确的,也是经典的例题。
数组指针指针数组