指针与数组变着花样相互缠绵,搞得众人叫苦不堪,今天就让我来揭开它们的真面目!
指针与数组有以下三种缠绵方式:
1. 指向数组元素的指针
![这里写图片描述](https://img-blog.csdn.net/20170218115829228?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2. 指向数组的指针
![这里写图片描述](https://img-blog.csdn.net/20170218115919635?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3. 指针数组
![这里写图片描述](https://img-blog.csdn.net/20170218115927182?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhldXNQcm9tZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下面对三种方式进行辨析与举例
首先要注意的是,指针指向一块数据其实包含了两部分信息,一是数据的地址,二是数据的大小,这才有了“指向数组元素的指针”和“指向数组的指针”的区别:他们指向同个地址,但是前者指向的数据的大小是一个数组元素的大小,而后者指向的数据的大小是整个数组的大小。
1. 指向数组元素的指针
int array[2][4];
int *p_element = array;
// 等价于int *p_element = &array[0][0];
此时p_element指向数组的第一个元素array[0][0];
执行增量计算:
++
此时p_element指向数组的第二个元素array[0][1];
2. 指向数组的指针(一般用于多维数组)
int array[2][4];
int (*p_array)[4];
p_array = array;
此时p_array指向一维数组array[0](包含四个元素array[0][0]、array[0][1]、array[0][2]、array[0][3]);
执行增量运算:
++
此时p_array指向一维数组array[1](包含四个元素array[1][0]、array[1][1]、array[1][2]、array[1][3],它们也可以表示为(*p_array[0]、*p_array[1]、*p_array[2]、*p_array[3]));
3. 指针数组
int a, b, c, d;
int *array_p1[4] = {&a, &b, &c, &d};
四个数组元素都是指针,分别指向整型变量a、b、c、d
int array[2][4];
int *array_p2[2] = {array[0], &array[1]};
两个数组元素都是指针,分别指向整型变量array[0][0]和array[1][0]