规则
- 地址中存放的数据类型与指针类型相同;
- 指针变量的赋值必须是地址常量或者变量,不能是整数;
- 可以使用0作为空指针;
- 指针类型表示所指向的数据的类型而非其自身类型;
- void类型的指针,该对象可以被赋予任意类型对象的地址;
指向常量的指针
不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的地址;
int a;
const int *p = &a;
*p = 1;//报错,无法修改所指向变量的值
int b;
p = &b;//正确,可以修改指针变量存储的值
指针类型的常量
声明指针常量,指针的值(所指变量地址)本身不能被改变;
int a;
int * const p = &a;
int b;
p = &b;//报错
算术运算
指针p加上或者减去n,相当于指针p当前指向位置的前n个位置或者后n个位置;
运算结果与指针所指向的数据类型相关;
y = *p++;
y = *(p++);
//指向下一个数据,两者表示意思相同,* 与 ++ 运算优先级相同
关系运算
- 指针关系运算需要在相同类型的条件下进行;
- 相等意味着两个指针指向相同的地址;
- 指针变量可以与0比较;
- 0表示空指针,也就是不指向任何地址的指针;
指针处理数组
int array[5];
/*
初始化一个一维数组
array为数组的首地址
array 与 &array[0]效果相同
*array 就是 array[0]
*/
把数组作为函数的形参,等价于把指向数组元素类型的指针作为形参;
void f(int p[]);
void f(int p[3]);
void f(int *p);
使用指针打印数组元素;
# include<iostream>
using namespace std;
int main(){
int a[5] = {1,2,3,4,5};
for(int *p=a;p<(a+5);p++){
//使用指针p从数组首地址往后遍历
cout << *p << " ";
}
cout << endl;
return 0;
}
指针数组
//定义含三个指向int类型的指针
int * p[3];
//利用指针数组输出单位矩阵
# include<iostream>
using namespace std;
int main(){
int row1[] = {1,0,0};
int row2[] = {0,1,0};
int row3[] = {0,0,1};
//指针数组
int *prows[3] = {row1,row2,row3};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cout << prows[i][j] << " ";
}
}
return 0;
}