一维指针遍历二维数组

原创 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
  • 805

简单的输入输出、一维数组、二维数组、普通遍历、使用foreach语句遍历数组操作

简单的输入输出、一维数组、二维数组、普通遍历操作 using System; using System.Collections.Generic; using System.Linq; using S...
  • x_y_q_
  • x_y_q_
  • 2016年10月18日 23:03
  • 1747

C++ for循环 纯指针遍历多维数组

指针是C/C++中很重要的一个概念,对指针操作熟悉的人,一般对程序对内存的访问和使用都比较敏感,多了解底层是很有益处的。一直都使用下标(subscript)来访问数组。一起来尝试用指针吧 !     ...
  • Ace_Yom
  • Ace_Yom
  • 2015年10月08日 17:54
  • 2486

让一维指针指向二维数组空间的方法!

背景:int *p;int a[10][10];如何让一维指针p指向a[10][10]开辟的内存空间?正确的方法:        1.开始我用的笨方法是另外开辟一个内存空间int*p=new int ...
  • hywbd
  • hywbd
  • 2009年12月04日 13:41
  • 2948

指针遍历二维数组的三种方式

#include void func1(int p[][3], int row, int col){ //第一种遍历方式 传递 二维数组名(行指针) //通过下标遍历 简单明了 ...
  • AXuan_K
  • AXuan_K
  • 2016年07月18日 16:47
  • 2789

三种方法进行二维数组遍历输出---下标法、行指针、列指针

/* 二维数组遍历输出(3种方法) (1)下标方法 (2)列指针方法 (3)行指针方法 */ #include using namespace std; void output_...
  • smallgyy
  • smallgyy
  • 2012年12月24日 20:28
  • 2139

各种路径遍历二维数组

比如蛇形遍历,螺旋形遍历等等。 可以将遍历过程想象成一个状态机。当前状态为蛇行方向(上行/下行/左行/右行等等),遇到墙壁时将修改当前状态,走到终点时结束。 以蛇形遍历为例,一共有两种状态:上行(...
  • kingbird_Wang
  • kingbird_Wang
  • 2016年10月29日 17:44
  • 459

c++用指针遍历一维数组和二维数组

//统计一个字符数组里面字符出现个数 void main(){ char str1[100], temp; cin.getline(str1,100); cin >> temp;         in...
  • qq_31389755
  • qq_31389755
  • 2016年12月01日 22:28
  • 1126

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

废话少说,先上自己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
  • 1573

指针遍历字符串—华为机试题

9月5日,华为2014校园招聘的机试题目 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:   ...
  • u013147914
  • u013147914
  • 2014年02月25日 00:27
  • 863
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一维指针遍历二维数组
举报原因:
原因补充:

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