接上例,这次谈一下指针和数组的关系。
在上例中的例子其实已经涉及到了数组。我们采用的是通过地址运算符(&)来获取数组第一个元素的地址。其实另外还有一种方法,那就是:直接使用数组的名字。在表达式中使用数组名就相当于使用数组的第一个元素的地址。
下面的例子是等效的:
float* dp1 = &dues[0];
float* dp2 = dues;
我们来进一步讨论这种新的表示方法。
一个数组后面跟上加号和一个整型的表达式,就相当于以该整型表达式作为下标的数组元素的地址。
例如:
float* dp1 = &dues[2];
float* dp2 = dues+2;
如果是多维数组,那么在不带任何一维的下标时,这种地址表示法仍然适用。
先看下面的例子:
运行结果:
更令人疑惑的是,还可以在指针的后面加上数组的下标。
下面的代码是等价的:
int* ip;
x = *(ip+3);
x = ip[3];
这个例子表明,即使ip是一个指针,当他指向一个数组时,也可以采用数组元素的表示法来使用这个指针。
不仅如此,还可以利用指针表示法来使用数组名,这样也可以访问数组的元素。
例如:
int ia[10];
x = ia[3];
x = *(ia+3);
以下代码给出了指针和数组的常见用法:
运行结果如下:
可见,上诉6种写法都会在控制台输出同样的结果。
注意:
推荐最好还是对于下标就采用下标表示法,对于指针就采用指针表示法,这样更清晰易懂。上诉代码中的前2个循环就是如此。
另外还有一种变化形式是把数组变成一个指向数组的指针。如下所示,把上诉代码中的msg声明为一个字符型指针:
char* msg = "Now is the time/n";
程序将产生同样的输出结果。
可见,可以使用一个字符串常量来初始化字符型指针。在编译器内部,用一个字符型数组来表示字符串常量,当使用字符串常量时,实际上是引用它的内部地址。所以,把字符串赋给字符型指针实际上就是把常量的地址赋给指针。