鱼C论坛

 找回密码
 立即注册
查看: 1053|回复: 10

[已解决]关于指针和数组

[复制链接]
发表于 2020-10-15 10:08:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图 为什么二维数组的+1的跨度为一个元素而三维数组是两个元素
最佳答案
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[3][3] = {1,2,3,4,5,6,7,8,9};
        int b[3][3][3] = {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[0][i][j]);
                      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[1][i][j]);
                    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[2][i][j]);
                     k++;
                     if(k == 3)
                     {
                           printf("\n");
                           k = 0;
                     }
              }
        }
    printf("\n");
}

`NY6~E{T~87TWJ}75WSR{X0.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[3][3] = {1,2,3,4,5,6,7,8,9};
        int b[3][3][3] = {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[0][i][j]);
                      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[1][i][j]);
                    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[2][i][j]);
                     k++;
                     if(k == 3)
                     {
                           printf("\n");
                           k = 0;
                     }
              }
        }
    printf("\n");
}

三维数组1.jpg
三维数组2.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-15 19:51:30 | 显示全部楼层
进来学习一下,三维数组,看成是三个二维数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-16 10:05:57 | 显示全部楼层
风过无痕1989 发表于 2020-10-15 14:14
通常我们将二维数组看作是二个一维数组,那么对于三维数组,我们也就可以将之看成是三个二维数组。 ...

第二个二维数组不应该如图吗 这么说的话*b+1的值应该是20啊
G4T4X3YS%O12GX28W3MFCJ1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

那不好意思,我上面的回复错了,我去修改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 10:24:59 | 显示全部楼层
二维数组不是两个一维数组。
int  a[10][10];
这是10个一维数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 11:01:55 | 显示全部楼层
这是运算符优先级导致了你的错觉。
我们看一维数组
int a[2] = {0};
char b[2] = {0};

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

以上理解没问题吧。下面我们说二维数组
int a[2][2];
从你的输出来看,你的系统是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[2]][2][2];
*a 运算后,  *a 是指向一个二维数组的指针,也就是指针的指针,64位系统指针是8字节的因此
*a +1 - *a = 8

char 类型同理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-16 11:08:32 | 显示全部楼层
风过无痕1989 发表于 2020-10-16 10:16
程序输出的肯定是不会错的,应该是第一个二维数组的第一行第一个元素。

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

*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的  二维数组 a[3][3]应该是3个一维数组
理解了一下明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 14:04:53 | 显示全部楼层
2222ex 发表于 2020-10-16 11:08
*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的  二维数组 a[3][3]应该是3个一维 ...

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-16 14:18:52 | 显示全部楼层
2222ex 发表于 2020-10-16 11:08
*b+1应该是第一个二维数组的第二行第一个元素吧
楼上我也是这么认为的  二维数组 a[3][3]应该是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 列的值。

当然也可以通过类似的方法推算出来,只是三维数组用得相对比较少,理解就行了,用到的时候,再慢慢推吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 21:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表