指针变量
众所周知指针是C/C++中广泛使用的一种数据类型,能够方便的表示各种数据结构,使用数组和字符串,所以学习指针是我们在学习C语言中重要的一部分,下面我们来简单的认识一下指针变量。
一、指针变量的定义、赋值
使用指针前,我们需要定义一个指针变量,一般形式如下:
类型说明符 *变量名;
其中 * 表示这是一个指针变量,这与我们平常定义普通变量不同,下面我们来看看两者的区别;
1、普通变量的定义
int a=3;
这里定义了 a 是 int 型的,赋值为 3 。内存空间中,有一个位置存放 a 的值,对变量 a的存取操作实际上就是对这个内存空间的存取。内存空间的位置叫做地址,存放 3 的地址可以用到取操作符 & 对 a 运算得到:&a;
1、指针变量的定义
int *p=NULL;
这里定义了一个指针变量 p ,p指向一个内存空间,里面存放的是一个内存地址为NULL(其实就是0,表示特殊的空地址)
1、给指针变量赋值
p=&a;
这里表示把 a 的内存空间地址(比如XXX)给了 p 。 下面我们上代码
int a = 3;
int *p = NULL;
p = &a;
printf("%d %d %d",a,*p,p);
我们的输出则是
3 3 6487572
如果我们直接输出 p 的话,我们得到的则是一个奇怪的数,这个就是 a 的内存地址,而 *p 才是我们真正想要得到的 a 的值 显然,我们直接操作的是将 a 的地址存储到 p 中,通过这个地址 间接操作才能得到 a 的值 3 ;
下面我们来看一个简单的图解 实际上,*p 表示 p 指向的变量,而 p 中存放的是变量的地址,所以 *p 访问的就是 a, 也就是说 *p 与 a 其实是等价的。
二、指针的引用与运算
1、指针变量的初始化
1 、 int *p = NULL; — NULL是特殊的地址,叫零指针 2、 int *p = new(int) ; —申请一个空间给p,*p内容不确定 3、 int a; int *p = &a; —p初始化a的地址
2、指针变量的运算
如果我们对两个变量进行运算呢? 我们以加法运算为例:
int a = 3 , b = 2;
int t , t1;
int *p , *k;
p = &a;
k = &b;
t = a + b;
t1 = *p + *k;
printf("%d\n",t);
printf("%d\n",t1);
如此看来,我们要对两个变量进行运算,可以转换成对两个指针的运算;
即 有以下对应关系
p --------- &a *p -------- a *p=3 ----- a=3
3、无类型指针
一个指针,根据不同情况,可以指向不同的数据类型,这里我们就需要用到无类型指针 话不多说,上代码:
int a=3;
float b=3.5;
void *p;
p=&a;
printf("%d\n",*(int*)p);
p=&b;
printf("%f\n",*(float*)p);
这里我们的输出如下
3
3.500000
4、多重指针
既然指针是指向其他类型的,那么指针本身也是一种类型; 在C++中,允许递归地指针指向指针的指针——多重指针 举个例子:
int a=3;
int *p;
int **pp;
p=&a;
pp=&p;
cout<<a<<" "<<*p<<" "<<**pp;
输出
3 3 3
|