二维数组
本帖最后由 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的地址,怎么打印出全部的?
计算机的内存是一维的对吧,那么在一维的内存里面怎么存储二维的数组呢。
你可以把行当做一块,也可以把列当做一块,一行一行(或者一列一列的存到计算机内存)
所以,总的来说,二维数组是人为定义的,但在计算机内存还是一维的,当然可以根据指针p来对数组进行访问
也不知道讲清楚了没{:10_277:}{:10_277:} 数据结构 数组那一章你可以好好看看 本帖最后由 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> 你的指针定义有错!a 的类型是 int (*) 型,p 的类型是 int * 型,系统是不能将 "int (*)" 类型的值分配到 "int *" 类型的实体的,应该定义为:p = a 本帖最后由 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: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]