【学习打卡】第6天 指针基础
2022/8/10 3:22:56
本文主要是介绍【学习打卡】第6天 指针基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
课程名称:C语言系统化精讲 重塑编程思想 打造坚实的开发基础
课程章节:第七章 玩转数组
授课老师:bennyhuo
指针基础
首先指针在 C 里是作为一种数据类型存在的,其定义方式非常的简单,在数据类型后加入 *
后即可:
int *p = &a; // 通常存的是变量的地址 printf("%d\n", *a);
指针通常在32位系统中占 4个字节,在64位系统中 占 8个字节。
而变量的 取地址符&
和 *
互为 逆操作,前者对变量操作(取地址),后者对地址操作(取地址中的值)。
只读指针变量 与 只读变量指针
了解上述两个拗口的概念,能够帮助你完整熟悉指针的用法。在了解了指针作为一个数据类型后,其用法的灵活性也充分显示出来:
//到底const 修饰的是谁,请倒着念。 int *const cp = &a ; // const 修饰的是指针,即该指针是一个const 指针。指针内容不能变,但指向的变量可以变。 int const *const ccp = &a ;// 利用上述 const 指针再指向一个const int 的变量。 int const * cvp = &a; // 单纯的指针指向const 变量,可以修改指针内容。
特殊指针
由于mingw
中 gcc
编译的程序始终使用的是相同的地址,所以可出现一个有意的现象:即指针可以指向自己:
int *p = (int*) 0x65fe18;// 该地址是从调试拿到的,也可以打印出来。
但绝大多数情况下,指针不应该使用硬编码的方式,而 msvc 则每次都会使用一个随机的栈。
而有些指针确实是硬编码了,如下列:
int *p = NULL; //0x00000000 地址,即空指针 int *pointer_at_large; // 野指针 void DangerousPointer(){ int a = 2; pointer_at_large = &a; // auto 变量 a 一旦销毁,pointer_at_large 就成为野指针 // statements pointer_at_large = NULL; //哪怕有这种需要,也一定要指向NULL ,进行销毁。 }
指针的运算
指针的加减是和其指向空间的数据类型相关的。这一点对于数组、动态申请的空间、高维数组的实现 ,意义非常大。
如:
int array[] = {1,2,3,4,5}; int *p = array; //这里 array 和 *p 用法是等价的,不过 array 是 const 的。
既然指针可以加减,那么自然可以比较大小,在适合的情况下,可以使用,还有相等也可以比。但一般也仅限在连续内存中才有意义。
左值和右值
在赋值表达式中,我们通常使用左值和右值代表表达式的两端,但实际情况中呢,左值永远代表内存空间,右值代表一个要赋的值。但在指针中呢?
int *p = &a; *p = 2; int b = *p; //此时*p 既可以充当左值又充当为右值的功能
课程收获
- 熟悉了指针使用的禁忌(
pointer_at_large
); - 复习了左右值得概念
- 对memory_view 了解得更深了;
这篇关于【学习打卡】第6天 指针基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28AI给的和自己写的Python代码,都无法改变输入框的内容,替换也不行
- 2024-09-27Sentinel配置限流资料:新手入门教程
- 2024-09-27Sentinel配置限流资料详解
- 2024-09-27Sentinel限流资料:新手入门教程
- 2024-09-26Sentinel限流资料入门详解
- 2024-09-26Springboot框架资料:初学者入门教程
- 2024-09-26Springboot框架资料详解:新手入门教程
- 2024-09-26Springboot企业级开发资料:新手入门指南
- 2024-09-26SpringBoot企业级开发资料新手指南
- 2024-09-26Springboot微服务资料入门教程