得到一堆黄色粘滞便笺,铅笔,橡皮擦和一支笔.
记下便条.用水平线划分.用笔在顶部写上"注释#1" .(此标记是永久性的).在底部用铅笔写"7" .将其粘贴在计算机屏幕的左上角.
此注释表示存储整数值7的内存位置.顶部是地址.每个地点都有自己独特的永久地址.底部是存储的值.
另请注意,将其划分为两个区域,同样在其上写上"注释#2"和"13".将它贴在第一个旁边的屏幕上.这是另一个存储整数值的内存位置,这次是13.
现在再说一遍.在注释的"地址"部分写下"注释#3".在注释的"值"部分写下" 注释#1 "(使用铅笔!).你刚刚创建了一个指针.将它贴在前两个音符旁边.
现在在另一张纸上写下几个简写:
a int #1
b int #2
p int* #3
Run Code Online (Sandbox Code Playgroud)
这代表符号表.a
,b
并且p
是*变量名称.在下一列中,我们有他们的类型,第三列包含他们的地址.
现在让我们做一些C语句.
a = 77;
Run Code Online (Sandbox Code Playgroud)
a
在符号表中查找.它是#1.擦除此笔记的值部分并77
改为编写(这是橡皮擦方便的地方).
b = 2017;
Run Code Online (Sandbox Code Playgroud)
这完全类似于前一个.
a = b;
Run Code Online (Sandbox Code Playgroud)
查找a
和b
你的符号表.它们分别是#1和#2.查看#2在其"值"部分中的注释.将该数字复制到注释#1的值部分.
*p = 42;
Run Code Online (Sandbox Code Playgroud)
p
在符号表中查找.那是#3.现在找到带有写在注释#3的值部分中的数字的注释.这就是称为解除引用的操作.它由*
上面的符号表示.擦除该音符的值部分(不是#3,#3 指向的那个),然后写入42
.
*p = b;
Run Code Online (Sandbox Code Playgroud)
自己做吧.这是你应该得到的:
p = &b;
Run Code Online (Sandbox Code Playgroud)
再次,查找p
和b
你的符号表(分别为#3,#2).现在取#2 的地址部分(&
通常称为操作,通常称为操作符的地址),并将其复制到#3 的值部分(当然先删除之前的内容).
*p = 42;
Run Code Online (Sandbox Code Playgroud)
现在应该很容易.
现在在#4下创建另一个指针.将其作为符号表存档q
.
q = NULL;
Run Code Online (Sandbox Code Playgroud)
找到q
(这是#4音符)并写入note #0
值部分.请注意,没有注释#0.这是一个空指针.它没有指向任何地址.
注意:该标准没有强制要求空指针其实是代表0它可能是note #99999999
或note #-1
也好,只要它是从所有现有的笔记不同
p = q;
Run Code Online (Sandbox Code Playgroud)
自己做吧.这是你应该得到的:
*p = 42;
Run Code Online (Sandbox Code Playgroud)
应该怎么办?表面上你应该拿p
(那是#3),找出它指向哪个音符,并改变那个音符.但它现在指出#0,并没有这样的说明.您已调用未定义的行为.C标准明确拒绝指定您的程序应该执行的操作.在实践中,它可能会崩溃,例如"分段错误(核心转储)"或"程序<程序名>已停止工作".