30天自制操作系统
上QQ阅读APP看书,第一时间看更新

5 指针的应用(2)(harib01e)

C语言中,*(p + i)还可以改写成p[i]这种形式,所以以上片段也可以写成这样:

p = (char *) 0xa0000; /*将地址赋值进去*/

for (i = 0; i <= 0xffff; i++) {
    p[i] = i & 0x0f;
}

其实要做的事还是没有什么变化,这里想要告诉大家各种写法,今后可以根据自己的喜好区别使用。

COLUMN-4 p[i]是数组吗?

写得不好的C语言教科书里,往往会说p[i]是数组p的第i个元素。这虽然也不算错,但终究有些敷衍。如果读者不懂汇编语言,这种敷衍的说法是最省事的。

p[i]与*(p + i )意思完全相同。要是嫌后者太长太麻烦,或者是为了看起来好看就会使用这种写法。在这个例子里,*(p + i )是6个字符,而p[i]只有4个字符。区别只有这一点,所以大家可以根据喜好使用。p[i]不过是一个看起来像数列的使用了地址变量的省略写法而已。

反过来说,也可以将p[0]写成*p,写成指针的形式反倒是节省了2个字符。总之,根据情况,按自己喜欢的方式写就行了。

不是说改变一下写法,地址变量就变成数组了。大家不要被那些劣质的教科书骗了。编译器生成的机器语言也完全一样。这比什么都更能证明,意思没有变化,只是写法不同。

说个题外话,加法运算可以交换顺序,所以将*(p + i)写成*(i + p) 也是可以的。同理,将p[i]写成i[p]也是可以的(可能你会不相信,但这样写既不会出错,也能正常运行)。a[2]也可以写成2[a](这当然是真的)。难道还能说这是名为2的数组的第a个元素吗?当然不能。所以,p[i]也好,i[p]也好,仅仅是一种省略写法,本质上讲,与数组没有关系。