经过前面两篇的学习,相信大家对一级指针有了更深的理解。但是,这还是不够的。今天,我将讨论一下* 与 []这两个操作符的关系以及指针移动的基础。因为前面我是有时用*p,有时用p[0],可能有人不明白。
比如对于int a[ ] = {1,2,3,4};int *p = a;在这里,a的值是 1 的地址,p也指向了 1 的地址。也就是说两个p与a的值是相同的。接下来,我分别用a与p来遍历。
#include <stdio.h>
void main()
{
int a[] = {1,2,3,4};
int i,len;
int *p = a;
len = sizeof(a)/sizeof(*a);
//1.
printf("a[i]形式遍历:");
for(i=0;i < len;i++)
{
printf("%4d",a[i]);
}
printf("\n");
/*
//2.
printf("*a形式遍历:");
for(i=0;i < len;i++)
{
printf("%d\t",*a++);
}
*/
printf("\n");
//3.
printf("p[i]形式遍历:");
for(i=0;i<len;i++)
{
printf("%4d",p[i]);
}
printf("\n");
//4.
printf("*p形式遍历:");
for(i=0;i<len;i++)
{
printf("%4d",*p++);
}
}
输出的结果:
a[i]形式遍历: 1 2 3 4
p[i]形式遍历: 1 2 3 4
*p形式遍历: 1 2 3 4
可以看到,不管是a[i]还是*p还是p[i],输出的结果都是一样的。
事实上,p[i]其实也就是*(p+i),只是p[i]的写法更加适合我们的书写,在编译时,编译器帮我们进行他们的转换。但对程序员来说,两者并没有区别。
另外,值得我们注意的是,对于上面的int*p,他并不是数组,但也能用[]这个操作符。很多人可能都是从谭浩强的那本C语言书开始学习C语言的,或许学的不深,学完后可能以为只有数组才能用[],事实上绝不是这样的,只要你能用*(p+i)来获取数据,你也就一定能用p[i]来获得同样的数据。
可能还有人会问,为什么没有*a的形式,也就是通过*a++的形式来遍历。这里主要是因为数组名比较特殊,是一个常量指针,也就是说,a的指向不能改变,上述中的a++相当于a的指向+1,这是不行的。
另外,指针的移动也是需要我们灵活应用的。在字符串的练习中,大家对于这点应该是深有体会。
比如对于char str[] = “asd”;char *p = str;同样的,此时p指向了字符’a’的位置。然后p++,p此时指向’s’的位置。再p++,p此时指向’d’的位置。在p++,p此时指向’\0’的位置。再比如char *q = str,此时,我想获取字符’s’,可以怎么办呢?1.str[1] 2.*(str + 1) 3.q[1] 4.*(q + 1) 大家可以想一想,怎么通过此时的p获取’s’呢。注意条件式此时的p已经指向了最后一个字符’\0’的位置。
以上就是今天的C语言指针基础,主要是讲述*与[]的关系以及指针的移动,大家只要在脑中想象出指针指向的画面,应该就能很好的理解。