文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于二级指针为函数参数的探讨

关于二级指针为函数参数的探讨

时间:2010-08-09  来源:westmylove


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

无非有两种使用方式 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

 

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








相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载