#创作计划#2.为备考四级而发的【指针】
2025-06-27 17:00:55
发布于:上海
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
小贴士:下文全是caidan
FIRST of ALL
指针的定义与基本操作
look in my eyes this programz:
#include<bits/stdc++.h>
using namespace std;
int main() {
int num = 42; // 定义一个整型变量
int* ptr = # // 定义一个指向整型的指针,并初始化为num的地址
cout << "num的值: " << num << std::endl; // 输出42
cout << "num的地址: " << &num << std::endl; // 输出内存地址
cout << "ptr存储的地址: " << ptr << std::endl; // 输出相同的内存地址
cout << "ptr指向的值: " << *ptr << std::endl; // 解引用,输出42
*ptr = 99; // 通过指针修改num的值
cout << "修改后的num: " << num << std::endl; // 输出99
return 0;
}
/*
正常人看注释就能看懂,你看不懂?
*/
输出结果:
SECOND
空指针与野指针
WHAT IS 野指针?
ans:当指针被定义后却没有进行初始化时,它会随机指向一个内存地址,这种指针就是野指针。
int* ptr; // 未初始化的指针 *ptr = 10; // 危险!解引用野指针
输出结果
为避免出现野指针(即指向无效内存的指针),在定义指针时若暂时没有明确的指向,应将其初始化为空指针:
int* ptr = nullptr; // 使用【nullptr】初始化空指针(注:C++11及以后版本) // int* ptr = 0; // 传统的初始化方式 // int* ptr = NULL; // 等效于上面的方式(需包含<cstddef>头文件) //同学表示<bits/stdc++.h>他不香吗 if (ptr == nullptr) { cout << "指针为空"; }
输出结果:
THIRD
指针与数组这里粗体是因为这个东西有点difficult
int a[5] = {1, 2, 3, 4, 5}; int* ptr = arr; // 等价于 ptr = &a[0]; // 通过指针访问数组元素 cout << *ptr; // 输出: 1 (等价于 a[0]) cout << *(ptr+2); // 输出: 3 (等价于 a[2])
输出结果:
注意事项
数组名 ≠ 指针:数组名是数组的起始地址,但它本身不是指针变量(不能被赋值)。
a = ptr; // 错误!数组名是常量,不能被修改
当数组作为sizeof、typeid或取地址符&的操作数时,不会退化为指针。
sizeof(a); // 返回整个数组的大小(上面的a数组5*4=20字节) &a; // 返回指向整个数组的指针(类型为 int(*)[5])
2.指针算术与数组访问
指针可以进行加减运算,从而实现对数组元素的遍历。int a[5] = {1, 2, 3, 4, 5};
int* ptr = arr;
// 指针加法
ptr++; // 指针后移一个元素(指向 arr[1])
cout << *ptr; // 输出: 2
// 指针减法
ptr = ptr - 1; // 指针前移一个元素(指向 arr[0])
cout << *ptr // 输出:1
输出结果:
attention:
指针与数组下标:arr[i] 等价于 *(arr + i),也等价于 (ptr + i)(当ptr指向arr时)。
指针算术会自动根据指针类型调整偏移量。例如,int 加 1 会移动 4 字节(假设int为 4 字节)。
3.多维数组与指针
多维数组在内存中是连续存储的,可以通过多级指针或数组指针访问。
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
// a 是一个二维数组,类型为 int[2][3]
// a[0] 是第一行,类型为 int[3]
// &a[0][0] 是第一个元素的地址,类型为 int*
int* ptr = &a[0][0]; // 指向第一个元素
cout << *(ptr + 3); // 输出: 4 (a[1][0])
// 使用数组指针访问整行
int (*row)[3] = a; // 指向包含3个int的数组
cout << (*row)[2]; // 输出: 3 (a[0][2])
row++; // 指向下一行
cout << (*row)[0]; // 输出: 4 (a[1][0])
指针与函数
把指针作为参数传递给函数,能够在函数内部对外部变量进行修改:
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y); // 传递变量的地址
cout << "x = " << x << ", y = " << y << endl; // 输出x=10, y=5
return 0;
}
输出结果:
THE END
掌握指针是学习 C++ 的重要环节,它能让你高效地操作内存,不过也要谨慎使用,防止出现常见的错误。
要看大彩蛋吗:
全部评论 6
没有彩蛋,差评
2025-06-27 来自 天津
2有的兄弟有的
2025-06-27 来自 上海
1没有,我没看见
2025-06-27 来自 天津
1没有,差评+1
2025-07-09 来自 福建
1
差评
2025-07-07 来自 上海
12025-06-27 来自 上海
1不顶
2025-07-07 来自 上海
0
d
2025-06-27 来自 上海
0不顶
2025-07-07 来自 上海
1
d
2025-06-27 来自 上海
0不顶
2025-07-07 来自 上海
1
d
2025-06-27 来自 上海
0不顶
2025-07-07 来自 上海
1
有帮助,赞一个