概念
指针是一个变量,它存储的是另一个变量的内存地址。
基础使用指针
//声明
int* ptr; // 声明一个指向 int 类型的指针
//初始化
int num = 5;
int* ptr2 = # // 使 ptr2 指向 num 的地址
//访问值
cout << *ptr2; // 输出 ptr2 所指向的 num 的值,即 5
//空指针
int* ptr3 = NULL; // 空指针,表示不指向任何有效的内存地址
指针与数组
数组名可以看作是一个指向数组首元素的指针。
可以通过指针遍历数组。
指针作为函数参数
传值调用:函数内部对参数的修改不会影响到函数外部的变量。
传指针调用:将变量的地址传递给函数,函数内部通过指针可以修改外部变量的值。
// 示例函数
void test(int* ptr) {
*ptr = 10; // 修改指针所指向的值
}
int main() {
int num = 5;
test(&num); // 传递 num 的地址
cout << num; // 输出 10
}
指针操作结构体
struct Student {
string name;
int age;
};
int main() {
Student s = {"张三", 20};
Student* ss = &s; // 指向结构体变量的指针
// 通过指针访问结构体成员
cout << ss->name << " " << ss->age;
}
图解
先来上代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5]={1,2,3,4,5};
cout << &a[0] << endl;//0x73fe00
cout << &a[1] << endl;//0x73fe04
cout << &a[2] << endl;//0x73fe08
cout << &a[3] << endl;//0x73fe0c
cout << &a[4] << endl;//0x73fe10
cout << "=========\n";
int b[5]={1,2,3,4,5};
cout << &b[0] << endl;//0x73fde0
cout << &b[1] << endl;//0x73fde4
cout << &b[2] << endl;//0x73fde8
cout << &b[3] << endl;//0x73fdec
cout << &b[4] << endl;//0x73fdf0
cout << "=========\n";
int c[5]={1,1,2,2,5};
cout << &c[0] << endl;//0x73fdc0
cout << &c[1] << endl;//0x73fdc4
cout << &c[2] << endl;//0x73fdc8
cout << &c[3] << endl;//0x73fdcc
cout << &c[4] << endl;//0x73fdd0
cout << "=========";
return 0;
}
再来图
这张图给大家说明了,每个元素的地址都是独一无二的,就如同凭借一个地址只能定位到一个特定的位置。然而,虽然地址不变,但这个地址所对应的内容是可以被更改的。所以,我们常常借助指针来修改值,一旦某个地址中的值被修改,那么凡是使用这个地址获取值的操作,所得到的值都会相应发生变化。
以下是一个指针的小故事:
有一个神奇的魔法小镇,小镇上的每一座房子都有一个独特的编号,这个编号就相当于地址。有一天,一位魔法师得到了一把魔法钥匙,这把钥匙就像是指针。魔法师拿着钥匙打开了编号为 101 的房子,房子里原本放着一本魔法书。魔法师用另一本更厉害的魔法书替换了原来的那本。之后,凡是来到 101 号房子的人,看到的都是这本新的魔法书,而房子的编号 101 始终没有改变。
这就如同在 C++ 中,通过指针修改了某个地址中的值,使用这个地址获取值的操作都会得到修改后的新值,而地址本身保持不变。