有时候我们经常会把指针和数组混淆,其实数组就是数组,指针就是指针,他们之间没什么关系。
那么我们为什么会混淆呢?
我混淆的原因是:
- 1、数组和指针都是传址方式进行访问
- 2、数组可以用指针或者下标方式对数组进行访问
- 3、指针可以用指针方式或下标方式对指针进行访问
总的来说就是:数组和指针都是用传址方式进行访问,而且访问方式在表达形式上相同。
直接上题目:
题目:给出数组a[7],要求用不同方法取出数组的第五个元素。
#include <stdio.h>
int main()
{
int a[7]={0,1,2,3,4,5,6};
int *p = a;
/*******正确表达方式**********/
printf("a[4]=%d\n",a[4]);//数组的下标表现形式
printf("p[4]=%d\n",p[4]);//指针的下标表达方式
printf("*(a+4)=%d\n",*(a+4)); //数组的指针表达方式
printf("*(p+4)=%d\n",*(p+4)); //指针的指针表达方式
/********分界线,错误表达方式***********/
printf(" ****************** \n");
printf("(*a+4)=%d\n",(*a+4)); //结果虽然输出是4,但是它的意思是a[0]+4
printf("(&a+4)=%d\n",(&a+4));//这条语句的意思是&a+7sizeof(int),已经超出数组范围
//printf("*p[4]=%d\n",*p[4]); //直接语法错误
getch();//窗口保留函数,调试使用
return 0;
}
输出结果:
所以一共有四种方式(可能还有其他方式笔者还没有找到)来获取数组的元素。
注意:
1、 a是数组首元素的首地址,也就是 a[0]的首地址
2、&a 是数组的首地址
a和&a的值是一样,但是意思不一样
3、a+1 是数组下一元素的首地址,即 a[1]的首地址
4、&a+1 是本数组后的下一个地址,即&a+7sizeof(int)已经越过了本数组