18878977809 发表于 2020-12-7 21:10:56

二维数组

本帖最后由 18878977809 于 2020-12-7 21:14 编辑

#include<stdio.h>
void main()
{
        int a={1,2,3,4,5,6,7,8,9,10,11,12};
        int *p,i;
        p=a;
        for(i=0;i<12;++i)
        {
           printf("%3d",*(p+i));
           if((i+1)%4==0)
           {
                   printf("\n");
           }
        }
}
二维数组名a是a的地址,那么p存入的是a的地址,那p+i是 a【i】 的地址,行循环。没有列,还是一维的,*取值是二维a,a,a的地址,怎么打印出全部的?

城头有平安 发表于 2020-12-7 21:28:37

计算机的内存是一维的对吧,那么在一维的内存里面怎么存储二维的数组呢。

你可以把行当做一块,也可以把列当做一块,一行一行(或者一列一列的存到计算机内存)

所以,总的来说,二维数组是人为定义的,但在计算机内存还是一维的,当然可以根据指针p来对数组进行访问

也不知道讲清楚了没{:10_277:}{:10_277:}

城头有平安 发表于 2020-12-7 21:29:26

数据结构 数组那一章你可以好好看看

jackz007 发表于 2020-12-7 21:36:07

本帖最后由 jackz007 于 2020-12-7 21:40 编辑

#include<stdio.h>
int main(void)
{
      int a={1,2,3,4,5,6,7,8,9,10,11,12};
      int * p , (* q) , i , j                ;
      p = (int *) a                           ;
      for(i = 0 ; i < 12 ; i ++) {
                printf("%3d" , * (p + i))         ;
                if((i + 1) % 4 == 0) printf("\n") ;
      }
      q = a                                     ;
      for(i = 0 ; i < 3 ; i ++) {
                for(j = 0; j < 4 ; j ++) printf("%3d" , * (* (q + i) + j)) ;
                printf("\n")                                             ;
      }
}
      编译、运行实况
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
1234
5678
9 10 11 12
1234
5678
9 10 11 12

D:\00.Excise\C>

风过无痕1989 发表于 2020-12-7 21:47:40

你的指针定义有错!a 的类型是 int (*) 型,p 的类型是 int * 型,系统是不能将 "int (*)" 类型的值分配到 "int *" 类型的实体的,应该定义为:p = a

18878977809 发表于 2020-12-8 08:53:38

本帖最后由 18878977809 于 2020-12-8 08:59 编辑

风过无痕1989 发表于 2020-12-7 21:47
你的指针定义有错!a 的类型是 int (*) 型,p 的类型是 int * 型,系统是不能将 "int (*)" 类型的值 ...

这也是我疑惑的地方,在VC++6.0版本是可以运行的,且运行结果还是与a是一样的

风过无痕1989 发表于 2020-12-8 15:45:40

本帖最后由 风过无痕1989 于 2020-12-8 15:51 编辑

18878977809 发表于 2020-12-8 08:53
这也是我疑惑的地方,在VC++6.0版本是可以运行的,且运行结果还是与a是一样的

int a = {1,2,3,4,5,6,7,8,9,10,11,12};
则数组 a 有 3 个元素,分别为 a[ 0 ]、a[ 1 ]、a[ 2 ]。而每个元素都是一个一维数组,各包含 4 个元素,如 a[ 1 ]的 4 个元素是 a[ 1 ][ 0 ]、a[ 1 ][ 1 ]、a[ 1 ][ 2 ]、a[ 1 ][ 3 ]。
若有:
int *p = a[ 0 ];
则数组 a 的元素 a[ 1 ] 对应的指针为:p + 1 * 4 + 2
元素 a[ 1 ][ 2 ] 也就可以表示为:*( p + 1 * 4 + 2)
用下标表示法,a[ 1][ 2 ] 表示为:p

对上述二维数组 a,虽然 a[ 0 ]、a 都是数组首地址,但二者指向的对象不同。
a[ 0 ] 是一维数组的名字,它指向的是一维数组 a[ 0 ] 的首元素 a[ 0 ][ 0 ],对其进行 “*” 运算,得到的是一维数组元素 a[ 0 ]的值,即 *a[ 0 ] 与 a[ 0 ][ 0 ]是同一个值。
而 a 是一个二维数组的名字,它指向的是二维数组a的首元素 a[ 0 ],对 a 进行 “*” 运算,得到的是一维数组 a[ 0 ] 的首地址,即 *a 与 a 是同一个值。它的指针移动单位是“行”,所以 a+i 指向的是第 i 个行数组,即指向a[ i ]。
当用 int *p; 定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ] 对 p 赋值是正确的,而用 a 对 p 赋值是错误的。这一点请务必注意。
页: [1]
查看完整版本: 二维数组