还有下面的函数
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)
我自己也没把握,大家看对不对,谢谢
*((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++不支持数组,它只认识指针
肯定是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()阿!
麻烦你了
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;
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)
我自己也没把握,大家看对不对,谢谢
*((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++不支持数组,它只认识指针
肯定是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()阿!
麻烦你了
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;
double **pb= (double **)b;