关于二级指针与二维数组的联系问题!

时间:2023-01-31 19:57:50
假设现在有 double b[100][100];
还有下面的函数
GS2(int n, int m, double **a)
{
    for (int i= 0; i < n; i++)
    {
        for (int j= 0; j < m; j++)
          *((int *)a + m * i + j)= 0;   //是否为*((double *)a + m * i + j)
     }
}
怎样把b[100][100]传进去这个函数呢?就是说怎样把数组名b和double **a联系起来?

9 个解决方案

#1


指针地址的移动是需要考虑指针的类型的,指针类型的不同,每次地址+1的时候移动的字节是不一样的,所有在一般的系统中,int和double所占的位数不一样, 
*((int *)a + m * i + j)= 0;   //是否为*((double *)a + m * i + j)
估计这句话的意思是初始化数组a吧,我感觉不太对,因为你吧double*强制转换为int*后,每次移动的字节就不一样了~我觉得直接用*((double *)a + m * i + j)=0

这样的话,那么如果想要把a初始化为b,可以这样写,
*((double *)a + m * i + j)=*((double *)b + m * i + j)

我自己也没把握,大家看对不对,谢谢



#2


double 和int 的字节数不同,所以,是不同的,为什么要改为(int *)呢,直接使用(double *)不就行了吗?

#3


怎样把b[100][100]传进去这个函数呢?就是说怎样把数组名b和double **a联系起来?

#4


*((int *)a + m * i + j)= 0;   //是否为*((double *)a + m * i + j)
肯定是double了,因为这是我的笔误,呵呵
c++中没有高层意义上的数组,编译器所能理解的只有一块线性内存
多维数组也只是将这一块内存的进一步划分而已,编译器将多维数组
中元素的内存映射到了这块线性内存中。你也可以自己做这个映射工
作,代价是你自己需要仔细计算内存地址,好处是理论上你就可以生
成任意维的动态数组。
另外,数组名代表着数组的起始地址,但这是语义上的。
语法上数组名的实际意义还与数组维度相关。
比如:
int a[100];
int b[100][100];
在语义上a和b都应该是一个int的指针,而且它们的内容确实是int型的指针
但是在语法上b是 int **,对b的一次[]在语法上得到一个 int *
所以如果你自己要计算b中元素的地址,需要做(int *)b的强制转换

在使用上面的代码的时候,你会碰上非常痛苦的情况

double a[100][100];
a[100][100]= 100;    // 正确
GS2(100, 100, a);    // 运行正确

double **a= new double*[100];
for (int i= 0; i < 100; i++)
{
     a[i]= new double[100];
}
a[100][100]= 100;    // 正确,仿佛a已经是一个二维数组了
GS2(100, 100, a);    // 等待着崩溃吧,因为GS2里面处理的是线性内存区域

呵呵,这足以让我们知道c中指针和数组的混乱了
你看到一个 double **类型的参数,事实上,它有多种对象可以表示
因此几乎可以说,c++不支持数组,它只认识指针

#5


不行阿!测试:
GS2(int n, int m, double **a);

void main(void)
{
double a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};

Gauss_Matrix(5,5,a);
}

GS2(int n, int m, double **a)

   for (int i= 0; i < n; i++)
    {
        for (int j= 0; j < m; j++)
          *((double *)a + m * i + j)= 0;
     }


编译时有错:error C2664: 'Gauss_Matrix' : cannot convert parameter 2 from 'double [5][5]' to 'double ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast!

我在GS2()里面已经不是用数组操作而是如你所说计算内存的线性操作,但现在问题是数组b[100][100]根本传不进去GS2()阿!

麻烦你了

#6


强制类型转换

#7


强制类型转换??什么意思??不明白!!

#8


呵呵小弟水平有限请问怎样手工转换double [][]为double **????

#9


double b[100][100];
double **pb= (double **)b;

#1


指针地址的移动是需要考虑指针的类型的,指针类型的不同,每次地址+1的时候移动的字节是不一样的,所有在一般的系统中,int和double所占的位数不一样, 
*((int *)a + m * i + j)= 0;   //是否为*((double *)a + m * i + j)
估计这句话的意思是初始化数组a吧,我感觉不太对,因为你吧double*强制转换为int*后,每次移动的字节就不一样了~我觉得直接用*((double *)a + m * i + j)=0

这样的话,那么如果想要把a初始化为b,可以这样写,
*((double *)a + m * i + j)=*((double *)b + m * i + j)

我自己也没把握,大家看对不对,谢谢



#2


double 和int 的字节数不同,所以,是不同的,为什么要改为(int *)呢,直接使用(double *)不就行了吗?

#3


怎样把b[100][100]传进去这个函数呢?就是说怎样把数组名b和double **a联系起来?

#4


*((int *)a + m * i + j)= 0;   //是否为*((double *)a + m * i + j)
肯定是double了,因为这是我的笔误,呵呵
c++中没有高层意义上的数组,编译器所能理解的只有一块线性内存
多维数组也只是将这一块内存的进一步划分而已,编译器将多维数组
中元素的内存映射到了这块线性内存中。你也可以自己做这个映射工
作,代价是你自己需要仔细计算内存地址,好处是理论上你就可以生
成任意维的动态数组。
另外,数组名代表着数组的起始地址,但这是语义上的。
语法上数组名的实际意义还与数组维度相关。
比如:
int a[100];
int b[100][100];
在语义上a和b都应该是一个int的指针,而且它们的内容确实是int型的指针
但是在语法上b是 int **,对b的一次[]在语法上得到一个 int *
所以如果你自己要计算b中元素的地址,需要做(int *)b的强制转换

在使用上面的代码的时候,你会碰上非常痛苦的情况

double a[100][100];
a[100][100]= 100;    // 正确
GS2(100, 100, a);    // 运行正确

double **a= new double*[100];
for (int i= 0; i < 100; i++)
{
     a[i]= new double[100];
}
a[100][100]= 100;    // 正确,仿佛a已经是一个二维数组了
GS2(100, 100, a);    // 等待着崩溃吧,因为GS2里面处理的是线性内存区域

呵呵,这足以让我们知道c中指针和数组的混乱了
你看到一个 double **类型的参数,事实上,它有多种对象可以表示
因此几乎可以说,c++不支持数组,它只认识指针

#5


不行阿!测试:
GS2(int n, int m, double **a);

void main(void)
{
double a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};

Gauss_Matrix(5,5,a);
}

GS2(int n, int m, double **a)

   for (int i= 0; i < n; i++)
    {
        for (int j= 0; j < m; j++)
          *((double *)a + m * i + j)= 0;
     }


编译时有错:error C2664: 'Gauss_Matrix' : cannot convert parameter 2 from 'double [5][5]' to 'double ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast!

我在GS2()里面已经不是用数组操作而是如你所说计算内存的线性操作,但现在问题是数组b[100][100]根本传不进去GS2()阿!

麻烦你了

#6


强制类型转换

#7


强制类型转换??什么意思??不明白!!

#8


呵呵小弟水平有限请问怎样手工转换double [][]为double **????

#9


double b[100][100];
double **pb= (double **)b;