最近重新学习了指针,较之前而言有了更深刻的认识,所以简单做一些学习笔记,这篇文章相当于指针入门教程。
前言
本笔记基于油管上mycodeschool的视频教程:Pointers in C/C++,强烈推荐。因为讲课用的是英文,所以笔记中个别部分也会用到英文。
导语
Pointers is one concept that does not go down well with beginners in C/C++. In this tutorial, we have tried to demystify the concept of pointers. And all you need to know to understand this lesson, is how to write a basic C program, how to declare a variable and how to do simple arithmetic upon those variables.
指针对于C/C++初学者而言并不友好,让我们一起来揭开指针的神秘面纱吧。你只需要会写简单的程序,定义变量并且使用这些变量来做一些简单的计算即可。
正文
为了理解指针,我们首先应该了解各种数据类型的变量在计算机中是如何存储的。
我们用下面这张图来表示计算机中的内存。
我们在程序执行时提及的内存, 通常是指随机存取存储器(RAM),比如我们电脑的内存是有4G(Giga bytes)或者8G(Giga bytes)。
假设我们在内存中显示的这些片段或分区是一个字节的内存。
在典型的计算机体系结构中内存的每个字节都有一个地址。我们假设这个内存中的第一个字节(最下面的一个)的地址为0,地址从下往上递增(201→209)。
现在,我们定义一个整型变量a,一般而言,一个变量占用的内存取决于变量的数据类型和编译器,通常整型(int)占用4个字节,字符型(char)占用1个字节。在我们的例子中,使用204,205,206,207四个地址(字节)来存储a。
计算机有一个内部结构,一个查找表,其中存储了变量a的信息,它是类型整数,位于地址204,也就是变量的首地址,所以我们也说a的地址为204。
我们再定义一个字符型变量c,c占用1个字节,我们使用地址209
来存储c。
然后,我们再写一个表达式a = 5
,则a的值变成了5。(实际是以二进制存储,这里为了方便理解,我们使用十进制 )
再写一个表达式a++;
,则a的值变成了6。
现在,我们已经了解了各种数据类型的变量在计算机中是如何存储的,那我们怎么才能知道程序中变量的地址呢?或者我们可以在程序中操作这些内存地址吗?
当然,我们在C/C++可以使用指针,那么什么是指针呢?
Pointers are variables that store the address of another variable.
指针是存储另一个变量地址的变量。
为了帮助理解,我们再画一个表。假设我们有一个区域有4个字节,该区域存储了整型数a,其首地址为204。我们还有另外一个变量p,p是指向整型的指针。现在,指针p可以存储变量a的地址,使用p的某些属性或者运算符,我们就可以到达a。
指针p本身也占用内存,我们假设p存储在地址64。注意:指针通常占用4个字节。
假设我们还有一个整型变量b存储在地址208处,如果我们将p中的地址从204更改为208,那么p就指向了变量b。
现在让我们看一下C/C++中指针的语法。
一个变量通常由变量类型和变量名来完成定义,比如定义一个值为5的整型变量a的写法为int a = 5;
,其中int为变量类型,a为变量名。如果我们想定义一个指向其他变量的指针变量p,我们只需要在变量名前加一个星号(*),其写法为int *p;
,p现在就是一个指向整型变量的指针,它可以存储整型变量的地址。假设用p来存储a的地址(即p指向a),我们需要用到取地址符&(&a表示a的地址),其写法为p = &a;
。
- 如果我们要输出指针p(Print(p)),那么输出的是多少呢?没错,就是204,因为它存的就是变量a的地址204。
- 如果要输出变量a的地址(Print(&a)),显而易见输出的也是204。
- 如果要输出指针p的地址(Print(&p)),那么输出的是64。
- 如果要输出*p(Print(*p)),那么输出的应该是多少呢?答案是5,因为在指针的前面加*号,表示的是取这个指针指向的位置的值。这也称为取消引用,因为我们有一个引用或者说我们在p中存储了一个地址。我们使用运算符*获取特定地址的值。
- 事实上,我们能通过表达式
*p = 8;
来修改p指向的位置上的值,*p means value at 'p',and so the value at 'p' is now modified to 8.,此时,输出a的值Print(a)的结果为8。 - So, 'p' is the address and *p is the value at address, that is stored in 'p'.
小结
让我们来回顾一下,首先我们学习了各种数据类型的变量在计算机中是如何存储的,然后我们学习了指针的基本操作:在变量名前加*来定义一个指针;在变量名前加&来表示该变量地址;在指针前加*来取出该指针存储的地址的值。
赏
惶心
假装听懂了的样子.jpg
太傅
@惶心 说真的,可以尝试看一下呀@[doge5]
惶心
@太傅 最近给自己挖了挺多坑的,比如 2-3篇博文,尝试帮助维棠重建官网,还有一个 chajian.hxco.de 想做……而且快考试了 超级没时间
太傅
@惶心 安排的时间太满了,加油@(击掌)