第一次写的代码:
//9-3求二维数组每行元素的平均值(指针)
#include
int main()
{
int a[][4] = {1,2,3,4,5,9,1,0,5,6,7,8,2,4,6,9,6,3,7,9};
int *p = &a[0][0];
printf("\n\n列指针:\n");
for(int i=0; i<4; i++)
{
for(int j=0; j<5; j++)
{
printf("%3d ", *((p+i)+j));// (p+i):%p\t
}
printf("\n");
}
return 0;
}
结果:
明显不对……
原因分析:
由于我的代码中,声明时,二维数组的列数为4, 一共输入了20个数字,所以应该是5行4列,所以在for循环中,i应为 for(int i=0; i<5; i++) 内层循环应该为 for(int j=0; j<4; j++)。当行列不匹配时,势必会出现指针p指向空区域的情况。
下面是第一种正确的遍历方式:(利用指针数组对其进行访问)
#include
int main()
{
int a[5][4] = {1,2,3,4,5,9,1,0,5,6,7,8,2,4,6,9,6,3,7,9};
// 指针遍历数组的第一种方式:
int *p[5] = {a[0], a[1], a[2], a[3], a[4]};
// 此处声明的是一个5行的指针数组,
//每一元素分别指向的是二维数组a的行指针
for(int i=0; i<5; i++)
{
for(int j=0; j<4; j++)
{
/*下面的指针变量方式也即对应的是这个指针数组的遍历方式*/
// printf("%3d ", *((p+i)+j)); // 不对
// printf("%3d ", *(*(p+i)+j)); // 正确
printf("%3d ", *(p[i]+j)) ; //正确
}
printf("\n");
}
return 0;
}
下面是第二种正确的遍历方式:(利用一维指针对其进行访问)
#include
int main()
{
int a[5][4] = {1,2,3,4,5,9,1,0,5,6,7,8,2,4,6,9,6,3,7,9};
// 指针遍历数组的第二种方式:
int *p = &a[0][0]; // 声明了一个指针变量,(仅仅也只是一个一维条件下的变量)
for(int i=0; i<5; i++)
{
for(int j=0; j<4; j++)
{
/*下面的这个指针变量的遍历也即仅仅是按位一个个的对其访问*/
printf("%3d ", *p++);
}
printf("\n");
}
return 0;
}