C++指针

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 = &num; 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; }
阅读(193)
评论(0)
updated@2021-01-22
评论区
目录