1. 声明一个指针
需要注意的是,声明了一个指针之后,请立即让它指向一个有意义的地址,否则不要声明一个指针,以避免一些未知的错误。
int num = 8;
int *pt; // 声明一个 int 型指针
pt = # // 将指针指向一个存储了int型值的地址
2. 指针的实质
查看以下示例代码
#include <iostream>
#include <string>
using namespace std;
int main () {
int num = 8;
int *pt;
pt = #
cout << "pt 的size为" << sizeof(pt) << endl;
cout << "num 的size为" << sizeof(num) << endl;
cout << "pt = " << pt << endl;
cout << "pt 指向的地址存储的值为" << *pt << endl;
cout << endl; // 打印一行空行
double db = 8.0;
double *pd;
pd = &db;
cout << "pd 的size为" << sizeof(pd) << endl;
cout << "db 的size为" << sizeof(db) << endl;
cout << "pd = " << pd << endl;
cout << "pd 指向的地址存储的值为" << *pd << endl;
return 0;
}
以上代码的运行结果如下所示:
pt 的size为8 num 的size为4 pt = 0x7ffd558964ac pt 指向的地址存储的值为8 pd 的size为8 db 的size为8 pd = 0x7ffd558964b0 pd 指向的地址存储的值为8
指针实际上存储的是一个地址: 程序中我们声明了两个指针,一个int类型指针,一个double类型指针,但是它们的大小(sizeof()
)都是8个字节,也就是64位,也就是说指针的大小跟指针声明的类型无关,取决于你使用的是多少位的操作系统。
3. 使用指针操作数组
查看以下示例代码
#include <iostream>
#include <string>
using namespace std;
int main () {
int nums[4] = {1, 2, 3, 4};
int *pt; // 声明一个 int 指针
pt = &nums[0]; // 指向数组的第一个元素
for (int i = 0; i < 4; i++)
{
cout << "pt+" << i << "指向的地址为 " << pt+i;
cout << ", 该地址存储的值为" << *(pt+i) << endl;
}
return 0;
}
以上代码的运行结果如下所示:
pt+0指向的地址为 0x7ffca96185d0, 该地址存储的值为1 pt+1指向的地址为 0x7ffca96185d4, 该地址存储的值为2 pt+2指向的地址为 0x7ffca96185d8, 该地址存储的值为3 pt+3指向的地址为 0x7ffca96185dc, 该地址存储的值为4
- 指针的运算:指针的实质是一个物理地址,所以它的乘除没有意义。指针的加减法对应于物理地址的加减。假设有一个type类型的指针pt, 那么 $$pt + i = pt + sizeof(type) * i$$ 减法同理
- 注意越界:指针操作数组时,需要注意不要越界,否则会消费一些未知的值,比如下面这段代码不会报错,但是会得到一个垃圾值(你不知道它真正的含义)。
#include <iostream>
#include <string>
using namespace std;
int main () {
int nums[4] = {1, 2, 3, 4};
int *pt;
pt = &nums[0];
cout << "pt+4" << "指向的地址为 " << pt+4;
cout << ", 该地址存储的值为" << *(pt+4) << endl;
return 0;
}