一维指针遍历二维数组

原创 2004年07月08日 17:30:00

前日于清华编程技术版看到一个帖子,说谭浩强的书中有一段代码,不能通过编译,代码如下:

main()
{
   int a[ 5 ][ 5 ], *p;
   p = a;
   *( *( p + 1 ) + 1 ) = 10;
}

问题是显然的,一维指针被当成二维指针使用,本来问题到此结束。我却自以为是的发表了如下观点:指针的运算是按维数进行的。而你学了数据结构就该知道无论是一唯还是多维,都线性存储的,这就意味者指针的移动是跳跃式的。那么显然一维指针是不可能遍历多维数组的。于是懂行之人立马反对。

于是,打算以事实反驳。写了如下代码:

#include “stdio.h” 
#include  “stdlib.h“
int main()
{
    int i,j;
    int a[ 2 ] [ 3 ] ;
    for( i = 0; i < 2; ++i )
        for ( j = 0; j < 3; ++j )
            a[ i ][ j ] = 10;
    int *p = a ;
    for( i = 0; i < 2; ++i )
        for ( j = 0; j < 3; ++j )
            printf("%d/n", *( ( p + i * 3 ) + j ) ) ;

    system("pause");
    return 0;
}
在dev c++下不通过。正喜,但是发现编译器错误指竟然是这句:int *p = a;说类型不合。p不能指向a[ 0 ][ 0 ]?于理不合呀,然后显式调用a数组首地址。修改如下

#include “stdio.h“
#include  “stdlib.h“
int main()
{
    int i,j;
    int a[ 2 ] [ 3 ] ;
    for( i = 0; i < 2; ++i )
        for ( j = 0; j < 3; ++j )
            a[ i ][ j ] = 10;
    int *p = &a[ 0 ][ 0 ] ;
    for( i = 0; i < 2; ++i )
        for ( j = 0; j < 3; ++j )
            printf("%d/n", *( ( p + i * 3 ) + j ) ) ;

    system("pause");
    return 0;
}
居然完全正确!我最初观点被否定。但是此刻我已经忘了这个,我不理解的是:

int *p = a;
int *p = &a[ 0 ][ 0 ];

居然完全不同,于是试了一切可能被用的法子
int *p[ 2 ] = a;//不通过,这个合理。指针数组并未初始化,
int **p = a;//不通过,想想也是,当时脑子进水。

后来发现文件名字是abx.cpp,于是改为abx.c再试,
int *p = a;通过编译。呼出口郁闷气。

猛然想起c++是乃强类型语言,今日方知其涵义。

答案如下,p为int * 。a为int[ 2 ][ 3 ].显然类型不配
p为int*[2]还是int*[3]?
呵呵,至此记录完毕。


 

使用一维数组或指针遍历二维数组

//使用一维数组打印二维数组#include void print_array(int* a,int length) { int i = 0; for(i=0;i...
  • daa20
  • daa20
  • 2016年06月26日 09:34
  • 777

一维指针和二维指针指向二维数组的一些问题

废话少说,先上自己Dev c++上的代码: #includeint main (){ int c[2][3]={15,2,3,4,5,6}, *p, (*rp)[3],*q,i; ...
  • qq_33268231
  • qq_33268231
  • 2016年01月26日 01:16
  • 1537

一维数组与二维数组深度解剖

祥细分析一维数组与多维数组 1、首先我们来看一下一维数组 一维数组的定义:类型名 数组名[元素个数]     我们知道 编译器会在内存中会根据元素个数和元素数据类型分配一段连续的内存...
  • sinat_30438007
  • sinat_30438007
  • 2015年12月16日 01:04
  • 346

关于二维指针强制转换及传递的简单剖析

关于二维指针强制转换及传递的简单剖析。 C语言中的两大利器:强制转换、指针。很多小伙伴在学习C语言的过程中都遇到过一支拦路虎,那就是指针。 C很自由,但是自由同样暗示着你需要付出更多精力去使其正常...
  • so_foolish
  • so_foolish
  • 2017年04月01日 12:04
  • 479

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include #include   void main(void) {    ...
  • toto1297488504
  • toto1297488504
  • 2014年08月01日 01:08
  • 1856

js 的一维数组,二维数组

什么是数组 我们知道变量用来存储数据,一个变量只能存储一个内容。假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦。我们用...
  • yiren_99
  • yiren_99
  • 2015年08月21日 19:20
  • 1168

一维数组和二维数组矩阵乘法

//二维数组存储矩阵乘法 void multi(int a[3][3], int b[3][2]){ for (int i=0;i
  • greenapple_shan
  • greenapple_shan
  • 2014年11月23日 16:19
  • 1824

练习LINQ:同时操作二维和一维数组,把二维数组转为一维,计算一维和二维值,字符串组合,计算数组和,数组筛选,排序

string[] 数据 = { "甲;乙;丁;|60", "甲;乙;|40", "乙;丁;|40", "丙;|20" }; Int32[] 值组 = 数据.Select(qq => q...
  • xianfajushi
  • xianfajushi
  • 2015年08月02日 18:01
  • 1125

两个一维数组合并为对应的二维数组(array_merge_recursive)

一:知识说明: 1.对于相同的字符串索引, array_merge则会用后面的值覆盖前面出现的值; +会用前面出现过的值覆盖后面相同的key; array_merge_recursive则会把...
  • u014796999
  • u014796999
  • 2016年04月08日 16:11
  • 1689

01背包的理解,二维数组化一维数组的理解(附hdu2602 Bone Collector)

01背包问题:有n个物品和一个容量为v的背包,用val[i]表示第i个物品的价值,用vol[i]表示第i个物品的体积,那么,如何使背包里装的物品的总价值最大呢?贪心是不行的,举个反例:n=3, v=1...
  • qq_33279781
  • qq_33279781
  • 2016年07月30日 16:41
  • 814
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一维指针遍历二维数组
举报原因:
原因补充:

(最多只允许输入30个字)