数组与指针
在初学数组与指针的时候,也就是大一,看的是谭浩强老师的书,当时学数组指针之前觉得并没有什么难的,但是看到数组与指针就完全蒙了,什么&,*符号还有不同的含义??看了C陷阱与指针,总算了解了一些。
对于C中的数组,需要注意的是:
1.c中只有一维数组,而所谓的二维数组其实就是一个一维数组,只不过这个数组中的每一个元素都是一个新的数组。类似于这种的嵌套就可以实现多维数组;
2.任何一个数组下标运算都等同于一个对应的指针运算,所以完全可以用指针操作来操作数组。
3.数组的元素的类型可以是千奇百怪的。例如:
struct{
int a;
float k[3];
} x[5];
这个例子当中,x是一个有5个元素的数组,而其中的每个元素都有着一个整型常量和一个长度为3的数组。
指针的定义
任何指针都是指向某种类型的变量。
int *p;/*定义p为一个指针*/
int i;
p = &i;/*将i的地址给p指针*/
这里的&操作符的作用是取地址,这样p指针就指向了i的内存单元。
而如果一个指针指向的是一个数组的某个元素,那么给指针加减就相当于指向这个元素的后前元素。
例如:
int *p;
int a[5];
p = a;
这里的a指的就是a[0]的地址,也就是数组中的第一个元素的地址,注意,这里不能写成p = &a,因为a已经是一个地址了。
那么p就被初始化为指向a[0],那么p+1就指向a[1],p+2就指向a[2],以此类推。
*操作符
即是引用,其实可以简单的把它看成取该指针所指向的地址的值。
例如:
int *p;
int a[3] = { 3,2,1 };
p = a;
printf("%d", *(p + 2));
这个例子打印出来的值即是1。
二维数组
正如前面所介绍的,二维数组实际上是以数组为元素的数组。
例如:
int calendar[12][31];
int *p;
int i;
这里的calendar是一个有着12个数组类型元素的数组,它的每个数组类型元素又是一个有着31个整形元素的数组,我们可以把calendar[4]看成一年中的第五个月。
p = calendar[4];
这个语句使指针p指向了数组calendar[4]中下标为0的元素,也就是说这儿calendar[4]只是一个名字,类似于之前的a[3]的a。类似的,calendar[4]+7也就是calendar[4]这个数组中的第7个元素的地址,*(calendar[4]+7)也就是这个数组中的第7个元素的值。