张世来4610484 发表于 2020-2-29 21:32:42

输出二维数组元素的值

本帖最后由 张世来4610484 于 2020-3-1 18:04 编辑

书上原话“指向整形变量的指针变量ptr只能指向a,*(a+i),&a等指向列的地址,而不能指向a+i,&a等指向行的地址”
代码如下:输出二维数组元素的值
#include <stdio.h>
void main ()
{
        static int a={{2,4,6,8},{10,12,14,16},{18,20,22,24}};
        int (*ptr);
        int i,j;
        ptr=a;
        for(i=0;i<3;i++)
        {
                for(j=0;j<4;j++)
                        printf("%4d",*(*(ptr+i)+j));
                printf("\n");
        }
}
请问ptr=a;这个是不是指向行的地址,而且上面我列举的五个不都是代表一个值吗,
为什么我换成ptr=a;或ptr=a;ptr=*a;这种就不行呢,求解,麻烦详细点,谢谢

chxchxkkk 发表于 2020-2-29 23:46:56

int (*ptr); 数组指针,指向一个有4个int元素的一维数组。
ptr=a; 也就是把二维数组a的地址赋给ptr。也就是a或&a。要清楚的是这里的 a不是一个数组元素值,而是a二维数组中第一行 一维数组 a-a的地址。 所以 *ptr = &a或 *ptr=&a。
*(ptr+i) 是第 i 行的地址。*(ptr+i)+j 就是第 i 行 第 j 列的地址。*(*(ptr+i)+j)就是 a的元素值了。

只要把 二维数组 a 中的 a 看成一个变量,比如说 b, b 是一个4个 int 元素的一维数组。就容易理解了。

张世来4610484 发表于 2020-3-1 18:14:48

chxchxkkk 发表于 2020-2-29 23:46
int (*ptr); 数组指针,指向一个有4个int元素的一维数组。
ptr=a; 也就是把二维数组a的地址赋给ptr。也 ...

你没有理解我的意思,我问的是二维数组中,a,a,&a,*a,&a这五个值不是一样的吗,比如说首地址a为2000,那么这五个是不是都等于2000,第一个问题是这五个中区分行地址和列地址是依据什么来分的?第二个问题是
ptr=a;
既然这五个值相等,那么我换成ptr=a;会报错,但换成ptr=&a;又可以是怎么回事?

冷回清风暖 发表于 2020-3-3 07:20:12

张世来4610484 发表于 2020-3-1 18:14
你没有理解我的意思,我问的是二维数组中,a,a,&a,*a,&a这五个值不是一样的吗,比如说首地址 ...

他们类型不同,相同的地址,但是含义不同
Ptr需要指向整个数组,而不是单个元素。
页: [1]
查看完整版本: 输出二维数组元素的值