什么是指针变量
一个变量的地址称为该变量的指针。
指针变量是一种存储被指向变量地址的特殊变量。
指针变量的声明方式:基类型 * 变量名;
指针工作方式:指针只存储一个地址,指针的基类型决定了取多少字节的数值,比如int * pint;
pint中存储的为内存地址,而int类型决定了取四个字节。
指针的赋值:
- 定义时赋值:
存储类型(默认auto) 基类型 * 变量名 = 初始地址;
- 指针变量赋值:
指针变量名 = &变量名;
指针基础应用
指针的声明、赋值与使用
#include <iostream>
using namespace std;
int main() {
int i; //定义int型数i
int *ptr = &i; //取i的地址赋给ptr
i = 10; //int型数赋初值
cout << "i = " << i << endl;
//输出int型数的值
cout << "*ptr = " << *ptr << endl;
//输出int型指针所指地址的内容
return 0;
}
常量指针与指针常量
常量的指针,可以理解为定义了一个指针指向常量。当指针变量作为变量时(* point)不可以修改(此时为常量),当指针变量作为指针时(point)可以修改
int a, b;
const int *p1 = &a; //p1是指向常量的指针
p1 = &b; //正确,p1指向的地址可以改变
*p1 = 1; //编译时出错,不能通过p1改变所指的对象
指针常量(常量类型的指针)
int a;
int * const p2 = &a;
*p2 = 10; //正确,p2指向的地址不能改变,但p2指向地址的值可以改变
p2 = &b; //错误,p2是指针常量,指向的地址不能改变
指针与数组
使用指针操作数组
指针指向数组时,实际上是指向数组的首地址。需要注意的是,指向数组的指针可以进行自加运算,但不可对数组首地址进行自加运算。
int a[10], *pa;
pa=&a[0]; //或 pa=a;
cout << (*(pa+1) == a[1]); //表达式值为真
cout << ((pa+2) == &a[2]); //表达式值位真
pa++; //指向数组下一位
a++; //错误,数组首地址为常量。
指针数组与二维指针
指针数组:由指针变量组成数组,每个元素都是同类型的指针变量。
二维指针:指针指向二维数组。二维数组在内存中存储时,是按照一维数组存储的,因此可以使用一维数组的方式进行访问。
#include<iostream>
using namespace std;
int main() {
int a[][3] = { {0,1,2},{3,4,5},{6,7,8} }; //定义二维数组
int * p = a[0]; //定义指针变量,指向一维数组
int * p1a[3] = { a[0],a[1],a[2] }; //定义指针数组
int(*p2a)[3] = a; //定义二维数组指针变量
cout << "指针数组:" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << "a[" << i << "][" << j << "]:" << p1a[i][j] << " ";
cout << endl;
}
cout << "二维数组指针(矩阵):" << endl;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << "a[" << i << "][" << j << "]:" << (*p2a + i * 3)[j] << " ";
cout << endl;
}
cout << "二维数组指针(行):" << endl;
for (int i = 0; i < 9; i++) {
cout << "a[" << i << "]" << *(*p2a + i) << " ";
}
return 0;
}
指针函数
函数在编译时会被分配一个入口地址,函数指针指向这个函数入口地址。
函数指针的声明:函数类型 (*指针名) (函数形参列表);
例如int (*max) (int, int);
。
#include<iostream>
using namespace std;
int max(int a, int b);
int main() {
int a, b, m;
int(*pFunc)(int, int);
pFunc = max;
cin >> a >> b;
m = pFunc(a, b);
cout << "Max = " << m << endl;
return 0;
}
int max(int a, int b)
{
int tmp = a;
if (a < b)
tmp = b;
return tmp;
}
指向指针的指针
#include<iostream>
#include<string>
using namespace std;
int main() {
const char *name[] = { "BASIC","COBOL","C++" };
const char **p;
p = name + 2;
cout << *p << endl;
cout << **p << endl;
return 0;
}