【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)
目录
- 一、指针简介
- 二、指针入门
- 1.初见指针
- 2.指针的解引用
- 3.指针的类型
- 4.野指针和空指针
- (1)野指针
- (2)空指针
- 5.指针的简单应用
- 6.结构体与指针
- 三、指针进阶
- 1.指针与数组
- 2.指针的运算
- 3.常量指针与指针常量
- (1)常量指针
- (2)指针常量
- (3)总结
- 3.字符指针与字符串、字符数组
- 4.指针数组与数组指针
- (1)指针数组
- (2)数组指针
- (3)总结
- 5.函数指针和指针函数
- (1)函数指针
- (2)指针函数
- 6.多级指针
- 四、指针高级
- 1.复杂指针类型的辨认
- 2.数组名隐式转换
- 3.void型指针
- 4.回调函数
- 5.零长数组(柔性数组)
- 6.数组与指针的补充
- 五、总结
一、指针简介
在C/C++编程中,**指针是一种极为特殊且关键的变量类型,它存储的是数据的内存地址而非数据值本身。**尽管指针的概念相对抽象,用法也颇为复杂,使得不少初学者感到晕头转向,但一旦能灵活运用指针,你便能实现对程序内存的精准把控,甚至细化到字节级别的控制。因此,学会并熟练使用指针,无疑是掌握C/C++编程的必经之路。
二、指针入门
1.初见指针
在正式介绍指针之前,需要先简单介绍一下计算机内存。首先需要明确的一点是,程序是运行在计算机内存里的,你可以将内存看成一个个可以存储数据的小盒子(内存单元),而且这些小盒子有自己在内存中唯一的编号(地址),而指针实际上存储的就是这些编号的值。
接下来介绍一下指针的基础语法。
声明一个指针的语法很简单:类型* 变量名,然后因为指针存放的是变量的内存地址,所以C/C++中可以通过 “&” 这个关键字来获取一个变量的地址,具体用法为:&变量 。具体使用如下代码所示:
#include using namespace std; int main() { int a = 10; //声明一个变量 int* p = &a; //通过&对变量a取地址,并将地址赋值给指针p cout int a = 10; //声明一个变量 int* p = &a; //通过&对变量a取地址,并将地址赋值给指针p cout int a = 10; int *p = &a; cout int a = 10; char c = 'a'; float f = 1.0f; int* p_a = &a; char* p_c = &c; float* p_f = &f; return 0; } int a = 10; char c = 'a'; int* p_a = &a; char* p_c = &c; cout int id; char ch; }; int main() { A a; A* p = &a; // 对结构体取地址,赋值给指针p return 0; } int* p = (int*) malloc(4); // 开辟4字节大小的内存,并将内存地址赋值给指针p *p = 10; // 将p指向的内存中的值设置为10 cout int *p = NULL; return 0; } // int* p = NULL; int *p = nullptr; return 0; } a = 99; //给a赋值99 } int main() { int a = 10; change(a); // 调用函数 cout *p = 99; //把指针解引用,直接改变内存中的值 } int main() { int a = 10; int* p = &a; change(p); // 调用函数,传入a的指针p cout int id; char name[100]; double score; }; int main() { Student stu = {19, "test", 89.4}; Student* p = &stu; return 0; } int id; char name[100]; double score; }; int main() { Student stu = {19, "test", 89.4}; Student* p = &stu; (*p).id = 129; cout int id; char name[100]; double score; }; int main() { Student stu = {19, "test", 89.4}; Student* p = &stu; // (*p).id = 129; p-id = 129; cout int a[5] = {1, 2, 3, 4, 5}; int* p = a; //将数组名赋值给一个指针 cout int* p_int = NULL; double* p_double = NULL; cout int arr[5] = {1, 2, 3, 4, 5}; // 通过数组下标访问 cout int arr[5] = {1, 2, 3, 4, 5}; // 直接将数组名当作指针进行运算 cout int a = 10; // 声明一个指向常量的指针 const int* p = &a; //或者 int const* p_t = &a; return 0; } int a = 10; int b = 20; const int* p = &a; p = &b; cout int a = 10; int* const p = &a; return 0; } int a = 10; int* const p = &a; *p = 99; cout char c = 'A'; char* p = &c; cout char arr[5] = {'h', 'e', 'l', 'l', 'o'}; char* p = arr; cout char arr[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; char* p = arr; // printf("%s\n", arr); cout const char* str = "hello"; cout char str[] = "hello"; cout
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。