Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27441
  • 博文数量: 9
  • 博客积分: 535
  • 博客等级: 中士
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-20 14:28
文章分类

全部博文(9)

文章存档

2010年(6)

2009年(3)

我的朋友

分类: C/C++

2010-08-09 02:08:49


最近在写一个程序的时候用到了二级指针作为函数参数的情况,就在函数内部如何操作二级指针为数组做以下探讨:

无非有两种使用方式 a[i][j] or *((type *)a + i*col + j)

先看下面的测试源码:







#include <iostream>

using namespace std;

void test( int col,double **a)
{
    int i,j;
    for ( i=0; i<col; i++)
    {
        for ( j=0; j<col; j++)
        {
            a[i][j] = 2.0;
        }
    }
}

void test_1( int col,double **a)
{
    int i,j;
    for ( i=0; i<col; i++)
    {
        for ( j=0; j<col; j++)
        {
            *((double *)a+i*col+j) = 2.0;
        }
    }
}

void main()
{
    int i,j,col ;

    cout <<"Please input a number must less than 5"<<endl;
    cin >>col;
    double ** a;
    a = new double* [col];

    double a_1[5][5];

    for ( i=0; i<col; i++ )
    {
        a[i] = new double[col];
    }
    for ( i=0; i<col; i++)
    {
        for ( j=0; j<col; j++)
        {
            a[i][j] = 1.0;
             a_1[i][j] = 10.0;
        }
    }

    test(col,a);        // 1. pass

    test(5,a_1);    // 2. error

    test_1(col,a);    // 3. error

    test_1(5,a_1);    // 4. pass


    delete [] a[0];
    delete [] a[1];
    delete [] a;
    cout <<"Done!" <<endl;
}


原因分析:

1.  Pass: 由于 **a 是之前new动态分配的,在分配内存时,系统已经记忆了列数,因此可以直接使用 a[i][j] 而不会有问题;

2.  Error: 由于 a_1[5][5] 为直接定义的,非动态分配,系统不清楚列数,因此使用a_1[i][j] 是会出现错误的;必须采用4的方式,指定列数 指针操作实现;

3.  Error: 由于在动态分配a时,a[i][0]~a[i][col] 地址是连续的,但是 a[0] a[1]…地址并不是间隔col*sizeof(type)的,所以指针操作时,必定指向错误的地址;以下地址仅供参考:

&a           0x003b6ff8

&a[0]        0x003b7048

&a[1]        0x003b7228

&a[2]        0x003b7290

&a[3]        0x003b72f8

&a[4]        0x003b7360

 

&a[0][0]   0x003b7048

&a[0][1]   0x003b7050

&a[0][2]   0x003b7058

&a[0][3]   0x003b7060

&a[0][4]   0x003b7068

 

&a[1][0]   0x003b7228

 

可以看到:

a[0][0]~a[0][4]之间是相差8个字节的;

a[1]a[2]之间相差104个字节,比我想象的8*5 64个字节;

可以参照http://blog.chinaunix.net/u1/57478/showart.php?id=2293698

具体64怎么来的,这个没算出来。。。有知道的朋友指教下。

 

4.  Pass: 具体参考http://hi.baidu.com/weijiel/blog/item/a674e509931eb48ad1581b90.html

 

即,在保证二维数组是由动态分配时,函数中可以直接按照数组的方式访问,不然则必须指针操作。








阅读(3469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~