怎样做指针的主人

应学院要求,写了一篇指针的学习心得,顺便也写成博客发了吧… 以下内容可能比较水,如果有错误,请与我联系,并对此修改。

什么是指针

==先来说说我的理解,我把整个程序想象成一个豪宅,每个变量是这座豪宅的每个房间,而指针就是这么多房间中其中一个房间的门牌号。接下来是官方的定义==。 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。如下图所示:

左侧连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。

为什么要学习指针

在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处: 1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效; 2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等; 3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。

如何声明一个指针

指针的声明比普通变量的声明多了一个一元运算符“*”,而“*”是间接寻址或者间接引用运算符。如下图,p是一个指针,保存着一个地址,该地址指向内存中的一个变量,*p则会访问这个地址所指向的变量。

1
2
3
4
5
int *p;        // 声明一个 int 类型的指针 p
char *p // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针

==注意指针数组和数组指针的区别==

初始化指针

声明一个指针变量并不会自动分配任何内存,在对指针间接访问之前,指针必须要初始化,如下图所示:

1
2
3
4
5
6
7
8
/* 方法1:使指针指向现有的内存 */
int x = 1;
int *p = &x;  // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址

/* 方法2:动态分配内存给指针 */
int *p;
p = (int *)malloc(sizeof(int) * 10);    // malloc 函数用于动态分配内存
free(p);    // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h

未初始化指针的后果:如果一个指针没有被初始化,那么程序不知道它会指向哪里,可能指向一个非法地址,这样会报错,“运气好的话”,会指向一个合法地址,或许程序会正常运行,但是这个指针所指向的地址的变量的值会被恶意修改,到时候电脑可能就……

NULL指针

NULL 指针是一个特殊的指针变量,本身是宏定义的,其本质上就是0,表示不指向任何内存的空指针。但是NULL在C和C++里的用法又是不一样的,就不多细说了。可参考这篇C/C++中对NULL的理解与总结

指针的用法

在这里就简略描述一下:指针的运算、指针与数组、指针与结构、指针与函数等…可参考:c语言常见的几种指针用法

总结

指针在计算机里充当着一个很重要的角色,我们要了解它,要弄懂它,我们要做豪宅的主人,不要做豪宅的客人!

参考: https://blog.csdn.net/soonfly/article/details/51131141 https://www.cnblogs.com/lulipro/p/7460206.html https://www.cnblogs.com/tongye/p/9650573.html

本文作者:jujimeizuo
本文地址https://blog.jujimeizuo.cn/2020/05/17/pointer/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!