8.1 指针
8.1.1 变量与指针
在c++中定义一个整型变量i,它需要4个字节,其内存就好像带有编号的小房间,所以编译器为变量i分配了编号为1000~1003的小房间,如图8.1所示。、
在程序代码中是通过变量名对内存单元进行存取操作,但是代码经过编译后已经将变量名转换为该变量在内存中的存放地址,对变量值的存取都是通过地址进行的。
一个变量的地址称为该变量的指针,如果一个变量专门用来存放另一个变量的地址,这就是指针变量。
指针是一种数据类型,通常说的指针就是指针变量,它是专门用来存放地址的变量,而变量的指针主要指的是变量的地址。
1、指针的声明
数据类型标识符 *指针变量名
例如
int *p_ipoint;//声明一个整数指针
float *a,*b;//声明一个浮点指针
2、指针的赋值
int i=100;
int *p_point=&i;
3、关于指针使用的说明
(1)指针变量名是p,而不是*p。
p=&i的意思是取变量i的地址赋值给指针变量p。
例如8.1 输出变量的地址
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i=100;
int *p=&i;
printf("%d\n",p);//获取地址值
return 0;
}
结果
(2)指针变量不可以直接赋值。例如:
int a=100;
int *p;
p=100;
这样编译不会通过,会出现“error C2440:‘=’:cannot convert from ‘const int’ to ‘int *’ ”的错误提示。
(3)不能将 *p当作变量使用。例如:
int a=100;
int *p;
*p=100;//指针没有获得地址
printf("%d",p);//出错语句
printf("%d",*p);//出错语句
上面的代码可以编译通过,但运行时会弹出错误对话框。
例子8.2 使用指针比较两个数的大小。
#include <iostream>
using namespace std;
int main()
{
int a,b;
int *p,*p1,*p2;
cout << "input a:" << endl;
cin>>a;
cout << "input b:" << endl;
cin>>b;
p1=&a;p2=&b;
if(a<b)
{
p=p1;
p1=p2;
p2=p;
}
cout<<"a="<<a;
cout<<" ";
cout<<"b="<<b;
cout<<endl;
cout<<"max="<<*p1<<",min="<<*p2<<endl;
return 0;
}
运行结果:
8.1.2指针运算符和取地址运算符
1、取地址运算符和指针运算符简介
*是指针运算符,&是取地址运算符。
取地址运算符可以使得指针得到变量的地址;指针通过指针运算符可以得到地址所对应的数值。
例子8.3 输出指针对应的数值。
#include <iostream>
using namespace std;
int main()
{
int a=100;
int *p=&a;
cout<<"a=:"<<a<<endl;
cout<<"*p=:"<<*p<<endl;
}
2、指针变量初始化
声明并初始化指针变量时用到了*和&两个运算符。例如
int *p=&a;
该语句等同于如下语句:
int *(p=&a);
3、区别
&和*的运算符优先级别相同,按自右向左的方向结合,因此&*p是先进行 *计算,*p相当于变量a,在进行&计算,&*a就相当于取变量a的地址。 * &a是先运算变量a的地址,然后运算指针运算符,最后取变量a所在地址的值,也就是a。
8.1.3 指针运算
指针变量储存的是地址值,对指针做运算就等于对地址做运算。
例子8.4 输出指针运算后的地址值。
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int a=100;
int *p=&a;
printf("address:%d\n",p);
p++;
printf("address:%d\n",p);
p--;
printf("address:%d\n",p);
p--;
printf("address:%d\n",p);
}
结果
指针进行一次加1运算,其地址值并没有加1,而是加4,这和声明指针的类型有关。
8.2 指针和数组
通过指针引用数组,就要先声明数组,在声明一个指针
int a[10];
int *p;
p=&a[0];
上面的程序意思就是将数组a[0]的地址赋给了指针p。
例子8.5通过指针变量获取数组中的元素
#include <iostream>
using namespace std;
int main()
{
int i,a[10];
int *p;
for(i=0;i<10;i++)
{
a[i]=i;
}
p=&a[0];
for(i=0;i<10;i++,p++)
{
cout << *p<< endl;
}
return 0;
}
上述代码意思就是:如果指针已经指向数组中的一个元素,则p+1指向同一个数组的下一个元素。p+i和a+i是a[i]的地址。