我不明白指针

时间:2017-04-30 11:51:05

标签: c pointers

什么是指针?什么是解除引用?如果Inputs Outputs x = 6 36 n = 2 x = 2 8 n = 3 是指针,p*p = some_value之间有什么区别? p = other_value是什么意思?什么是NULL指针?取消引用NULL指针会发生什么?

1 个答案:

答案 0 :(得分:5)

获得一叠黄色粘滞便笺,铅笔,橡皮擦和笔。

记下便条。用水平线划分。写下#34;注意#1"上面有一个。 (此标记是永久性的)。写" 7"底部有一个铅笔。将它贴在电脑屏幕的左上角。

此注释表示存储整数值7的内存位置。顶部是地址。每个地点都有自己独特的永久地址。底部是存储的

另请注意,将其划分为两个区域,同样写下#34;注意#2"和" 13"在上面。将它贴在第一个旁边的屏幕上。这是另一个存储整数值的内存位置,这次是13。

现在再说一遍。在"地址"笔记的一部分写着"注意#3"。在"值"笔记的一部分写了" note#1 " (用铅笔!)。您刚刚创建了指针。把它贴在前两个音符旁边。

现在在另一张纸上写下几个简写:

a    int     #1
b    int     #2
p    int*    #3

这代表符号表abp是*变量名称。在下一列中,我们有他们的类型,第三列包含他们的地址。

现在让我们做一些C语句。

a = 77;

在符号表中查找a。它是#1。删除此笔记的值部分,然后写77代替(橡皮擦带来的便利)。

b = 2017;

这完全类似于前一个。

a = b;

在符号表中查找ab。它们分别是#1和#2。看看#2中有哪些注释"值"部分。将该数字复制到音符#1的值部分。

*p = 42;

在符号表中查找p。那个注意事项#3。 现在找到带有写在#3 值部分的数字的注释。这就是名为解除引用的操作。它由上面的符号中的*表示。删除 注释的值部分(不是#3,#3是指向)中的任何内容,然后写入42

*p = b; 

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

p = &b;

再次,在符号表(分别为#3和#2)中查找pb。现在选择#2的地址部分(这是&代表的操作,通常称为地址 - 运算符)和将其复制到#3的值部分(当然会先删除之前的内容)。

*p = 42;

现在应该很容易。

现在在#4下创建另一个指针。将其作为q在您的符号表中归档。

q = NULL;

查找q(#4注释)并在值部分中写入note #0请注意,没有注释#0 。那是一个空指针。它没有指向任何地址。

警告:标准并未要求空指针实际表示为0.它可能是note #99999999note #-1或其他任何内容,只要它是&#39 ; s与所有现有笔记不同

 

p = q;

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

*p = 42;

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