1.指针简要介绍
(1)对于指针的理解:指针相当于一个指示器,指向一个地址,告诉程序在内存的哪个地方可以找到数据。
(2)指针变量的定义:
int *p=NULL; //定义了一个指针变量p,p指向一个内存空间,也就是特殊空地址NULL(其实就是0)
(3)给指针变量赋值:
int a=3;
int *p=&3;
//&是取地址符,即把变量a的内存空间地址给了p,也就是将p指针指向a的地址,所以p是a的地址&a,而*p才是a的值3(*是指针操作符)
//可能有点绕,不过我会尽量解释清楚
2.指针的加减法
一般地,若p是指针,k是正整数,则p+k为指针p后第k个元素,也就是从p开始,跳过k个整数的空间,到达第p+k个整数的地址。
举个不太好吃的栗子:
//省略头文件等
int a[]={10,11,12,13,14,15};
int *p=&a[0];
cout<<*(p+3);
这里将会输出一个整数 13,*(p+3)相当于从a[0]开始往后数三个数,到达a[3]
注意:* p+3和 *(p+3)有区别, * p+3是a[0]+3,而 *(p+3)才是a[3]
3.指针的特点
(1)指针是动态数据结构,它可以动态地申请空间
int *p=NULL; //这里在定义的时候,p并没有空间,要通过下一行的语句申请空间
p=new(int); //为p指针申请一个int类型的空间
这样做的优势在于,可以根据需要申请相应大小的空间,在一定程度上优化空间
(2)C++中,数组名可以作为指针使用
我们还是来吃栗子(这个栗子和上面的差不多)
#include<iostream>
using namespace std;
int main(){
int a[]={10,11,12,13,14,15}; //这里要注意,因为a数组已经赋值为了常量,所以计算机自己会算好大小,不需要写
int *p=a+4;
cout<<*a<<endl;
cout<<*(a+3)<<endl;
cout<<*(++p)<<endl;
return 0;
}
输出结果
10
13
15
我们来分析一下代码
int *p=a+4; //这里直接将a作为指针,a指向数组开始的元素10,a+4就是a[4]
cout<<*a<<endl; //输出a[0]
cout<<*(a+3)<<endl; //指针的加法,之前已经说过了
cout<<*(++p)<<endl; //同上
这里还要注意的是,a数组作为静态数据结构是固定不变的,而指针p是动态数据结构,可以变。比如说,a=a+2是不允许的,而p=p+2合法
(关于指针的第三个特点,下午更新)