任何指针都是指向某种类型的变量,例如,如果有这样的语句:
int *ip;
就表明ip是一个指向整型变量的指针,又如果声明:
int i;
那么我们可以将整型变量i的地址赋给指针ip,就像下面这样:
ip=&i;
而且,如果我们给*ip赋值,就能够改变i的取值:
*ip=17;
如果一个指针指向的是数组中的一个元素,那么我们只要给这个指针加1,就能够得到指向数组中下一个元素的指针,同样的,如果我们给这个指针减一,得到就是指向该数组中前一个元素的指针。对于除了1以外的其他整数的情形,以此类推。
上面这段讨论暗示了这样一个事实:给一个指针加上一个整数,与给该指针二进制表示加上同样的整数,两者的含义截然不同。如果ip指向一个整数,那么ip+1指向的是计算机内存中的下一个整数,在大多数现代计算机中,它都不同于ip所指向地址的下一个内存位置。
如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减,这样做是有意义的,例如:
int *q=p+i;
那么我们可以通过q-p而得到i的值,值得注意的是,如果p与q指向的不是同一个数组的元素,即使它们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得的结果仍然是无法保证其正确性的。
前面已经声明了a是一个拥有3个整型元素的数组。如果我们在应该出现指针的地方,却采用了数组名来替换,那么数组名就被当作指向该数组下标为0的元素的指针,因此如果我们这样写:
p=a;
就会把数组a中下标为0的元素的地址赋值给p。注意这里我们并没有写成:
p=&a;
这种写法在ANSI C中是非法的,因为&a是一个指向数组的指针,而p是一个指向整型变量的指针,它们的类型不匹配,大多数早期版本的c语言实现中,并没有所谓的数组的地址这一概念,因此&a或者被视为非法,或者就等于a。
继续我们的讨论,现在p指向数组a中下标为0的元素,p+1指向数组a中下标为1的元素,p+2指向数组a中下标为2的元素,一次类推。如果希望p指向数组a中下标为1的元素,可以这样写:
p=p+1;
当然,该语句完全等同于下面的写法:
p++;
除了a被用作运算符sizeof的参数这一情形,在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针。正如我们合乎情理的期待,sizeof(a)的结果是整个数组a的大小,而不是指向数组a元素的指针的大小。
延伸阅读
此文章所在专题列表如下:
本文地址:http://www.nowamagic.net/librarys/veda/detail/2033,欢迎访问原出处。
大家都在看