您的位置  > 互联网

:指针函数ptl越界的错误呢?

指针函数ptl可以访问参数传递给它的任何内存地址,并指向任何你想要的地方。 这就是“指针”的力量。 似乎我亲眼目睹了罗翔所说的张三这个刑法塑造的大众法律人物“法外狂人”的嚣张气焰,他正在试探法律的边界甚至法律之内。

法律约束人,指针受一套标准约束。 人就像指针一样,拥有绝对的自由,但如果没有法律的约束,社会和世界就会陷入混乱。 如果指针的使用不遵守规定,就会导致程序和系统崩溃。

上面的比喻虽然有失偏颇,但是描述得非常形象。 在C语言中,指针具有“绝对的自由”。 这是由于C语言信任程序员、程序中合法的原则。

回答完问题,我们来深入解释一下:

根据题目的程序,我添加了几行代码,以便大家更容易了解指针是如何工作的。

第14行:我删除了标题注释。 可以看到我的编辑器给出了数组下标越界的警告,但是程序还是可以编译运行的。 有些编译器可能会认为这是一个错误并拒绝编译。 它输出 119,这是数组的位置 a[5] 处的数字。 119对应于ASCII码中的“w”。

第 15 行:输出数字 0。 这是因为数组b[5]引用的是空字符“\0”,它对应于ASCII码中的数字0。

第16行:传递给指针函数ptl的实参“a”,是数组a的名字,代表数组a的首地址。 此时函数ptl内部对传递给它的地址a进行操作,使指针指向数组a的下标。 5(第 6 个元素)。 “数组a的第六个元素是多少?” 这时候注意图中我标注操作结果的箭头。 可以看到数组a和b的地址是连在一起的,所以函数ptl使指针指向a的下标5(a的第6个元素和b的第1个元素),也就是说函数ptl打印出数组 b 的第一个元素“w”。 此时您应该能够理解第 14 行输出为 119 的内容。

使用for循环打印出a[0]到a[11]这12个字符,也可以验证上面的解释。

我再修改一下程序。 注意,此时我已经去掉了数组a定义中方括号内的“5”,并仔细观察了输出:

这时候你会发现a和b的地址不同。 当数组a的大小没有声明时,它会根据初始化的字符串自动分配内存空间。 0到5的六个字节分配给数组a,其中存储hello和null字符。 a[5] 存储空字符,标记字符串的结尾; 从6到11的六个字节分配给数组b。 存储世界和空字符。 这时候你也可以通过查看for循环输出的结果来证明这一点。

此时输出第14行:0,因为a[5]引用数组a的空字符,ASCII码对应0。

第15行:输出0,因为b[5]引用数组b的空字符,ASCII码对应0。

第16行:输出为空字符,指针函数ptl指向元素a[5]。

经过这样的详细讲解,你想必对指针有了一定的深入了解。