我不明白指针

n. *_* m. 2 c pointers

什么是指针?什么是解除引用?如果p是指针,*p = some_value和之间有什么区别p = other_value?什么p = &some_variable意思?什么是NULL指针?取消引用NULL指针时会发生什么?

n. *_* m. 5

得到一堆黄色粘滞便笺,铅笔,橡皮擦和一支笔.

记下便条.用水平线划分.用笔在顶部写上"注释#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)

查找ab你的符号表.它们分别是#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)

再次,查找pb你的符号表(分别为#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 #99999999note #-1也好,只要它是从所有现有的笔记不同

p = q;
Run Code Online (Sandbox Code Playgroud)

自己做吧.这是你应该得到的:

*p = 42;
Run Code Online (Sandbox Code Playgroud)

应该怎么办?表面上你应该拿p(那是#3),找出它指向哪个音符,并改变那个音符.但它现在指出#0,并没有这样的说明.您已调用未定义的行为.C标准明确拒绝指定您的程序应该执行的操作.在实践中,它可能会崩溃,例如"分段错误(核心转储)"或"程序<程序名>已停止工作".