2222ex 发表于 2020-10-15 10:08:30

关于指针和数组

如图 为什么二维数组的+1的跨度为一个元素而三维数组是两个元素

风过无痕1989 发表于 2020-10-15 14:14:02

本帖最后由 风过无痕1989 于 2020-10-16 10:17 编辑

       通常我们将二维数组看作是二个一维数组,那么对于三维数组,我们也就可以将之看成是三个二维数组。下面的程序正是根据此思想设计的,从数组的贮存和运行来看,对于三维数组,b + 1 指向的是第一个二维数组第一行的第一个元素,而不是第一个二维数组的第二个元素

#include<stdio.h>

int main()
{
        int i,j,k = 0;
        int a = {1,2,3,4,5,6,7,8,9};
        int b = {10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37};
   
      printf("a      %p\n",*a);
      printf("a + 1: %p\n\n",*a + 1);
       
      printf("b      %p\n",*b);
      printf("b + 1: %p\n\n",*b + 1);

      printf("%p\n",*(*b + 1));
        printf("*b + 1 的值:%d\n",*(*(*b + 1)));// 输出 b + 1 的值

        printf("\n");
        for (i = 0;i < 3;i++)
        {
              for (j = 0;j < 3;j++)
              {
                      printf("%d\t",b);
                      k++;                              // 为了方面数组的美观,计数( 下同 )
                      if(k == 3)
                      {
                            printf("\n");             // 满三个元素换行( 下同 )
                          k = 0;
                      }
             }
        }
      printf("\n");

        k = 0;
        for (i = 0;i < 3;i++)
        {
              for (j = 0;j < 3;j++)
              {
                    printf("%d\t",b);
                  k++;
                  if(k == 3)
                  {
                        printf("\n");
                        k = 0;
                  }
              }
        }
      printf("\n");

      k = 0;
        for (i = 0;i < 3;i++)
        {
               for (j = 0;j < 3;j++)
              {
                   printf("%d\t",b);
                     k++;
                     if(k == 3)
                     {
                           printf("\n");
                           k = 0;
                     }
              }
        }
    printf("\n");
}

乐乐学编程 发表于 2020-10-15 19:51:30

进来学习一下,三维数组,看成是三个二维数组

2222ex 发表于 2020-10-16 10:05:57

风过无痕1989 发表于 2020-10-15 14:14
通常我们将二维数组看作是二个一维数组,那么对于三维数组,我们也就可以将之看成是三个二维数组。 ...

第二个二维数组不应该如图吗 这么说的话*b+1的值应该是20啊

风过无痕1989 发表于 2020-10-16 10:16:43

2222ex 发表于 2020-10-16 10:05
第二个二维数组不应该如图吗 这么说的话*b+1的值应该是20啊

程序输出的肯定是不会错的,应该是第一个二维数组的第一行第一个元素。

当时只想着告诉你三维数组可以看成是三个二维数组,对三维数组,*b + 1 并不是你所说的“两个元素”。

那不好意思,我上面的回复错了,我去修改一下

xieglt 发表于 2020-10-16 10:24:59

二维数组不是两个一维数组。
inta;
这是10个一维数组。

xieglt 发表于 2020-10-16 11:01:55

这是运算符优先级导致了你的错觉。
我们看一维数组
int a = {0};
char b = {0};

因为 int 类型是4个字节 所以a+1 - a = 4
因为char 类型是1个字节 所以 b+1 - b = 1

以上理解没问题吧。下面我们说二维数组
int a;
从你的输出来看,你的系统是64位系统,64位系统的指针是64位的,也就是8个字节。
那么 a+1 - a = 8;   
为什么 *a + 1 - *a = 4呢?因为 * 运算符的优先级比 + 高,
所以先进性 *a 运算 , *a 是一个1维 int 数组的指针 因此 *a + 1 - * a = 4
如果要获得 8 的结果,应该加上括号 *(a+1) - *a = 8 ,这是 先+1再取 *

以上理解没问题吧。下面再说三维数组
int a];
*a 运算后,*a 是指向一个二维数组的指针,也就是指针的指针,64位系统指针是8字节的因此
*a +1 - *a = 8

char 类型同理。

2222ex 发表于 2020-10-16 11:08:32

风过无痕1989 发表于 2020-10-16 10:16
程序输出的肯定是不会错的,应该是第一个二维数组的第一行第一个元素。

当时只想着告诉你三维数组可以 ...

*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的二维数组 a应该是3个一维数组
理解了一下明白了

xieglt 发表于 2020-10-16 11:13:32

2222ex 发表于 2020-10-16 11:08
*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的二维数组 a应该是3个一维 ...

是的

风过无痕1989 发表于 2020-10-16 14:04:53

2222ex 发表于 2020-10-16 11:08
*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的二维数组 a应该是3个一维 ...

是的

风过无痕1989 发表于 2020-10-16 14:18:52

2222ex 发表于 2020-10-16 11:08
*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的二维数组 a应该是3个一维 ...

对于二维数组,a[ i ][ j ] 是第 i 行(0 算起)第j列(0 算起)的元素值。a + i 是第 i 行的行指针,那么 *(a + i) 就是第 i 行第 0 个元素的指针,自然 *(a + i) + j 就是第 i 行的第 j 个元素的指针了,最后通过这个指针用 * 取出来的值 *(*(a + i) + j) 就是第 i 行第 j 列的值。

当然也可以通过类似的方法推算出来,只是三维数组用得相对比较少,理解就行了,用到的时候,再慢慢推吧
页: [1]
查看完整版本: 关于指针和数组