继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【学习打卡】第6天 指针基础

慕桂英7474859
关注TA
已关注
手记 6
粉丝 4
获赞 0

课程名称: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 变量,可以修改指针内容。 

特殊指针

由于mingwgcc 编译的程序始终使用的是相同的地址,所以可出现一个有意的现象:即指针可以指向自己:

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 了解得更深了;
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP