指针笔记 Introduction to pointers in C/C++

发布于 / 笔迹 / 4 条评论

最近重新学习了指针,较之前而言有了更深刻的认识,所以简单做一些学习笔记,这篇文章相当于指针入门教程。

申明

本笔记基于油管上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。

我们再定义一个字符型变量cc占用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。我们还有另外一个变量pp是指向整型的指针。现在,指针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’.

小结

让我们来回顾一下,首先我们学习了各种数据类型的变量在计算机中是如何存储的,然后我们学习了指针的基本操作:在变量名前加*来定义一个指针;在变量名前加&来表示该变量地址;在指针前加*来取出该指针存储的地址的值。


The end.
2018-03-06 星期二

转载原创文章请注明,转载自: 太傅 » 指针笔记 Introduction to pointers in C/C++
  1. 惶心

    假装听懂了的样子.jpg

    1. TaiFu_S
      @惶心

      说真的,可以尝试看一下呀doge5

      1. 惶心
        @TaiFu_S

        最近给自己挖了挺多坑的,比如 2-3篇博文,尝试帮助维棠重建官网,还有一个 chajian.hxco.de 想做……而且快考试了 超级没时间

        1. TaiFu_S
          @惶心

          安排的时间太满了,加油击掌