用二级指针传递二维数组

NeDong 2014-05-28 10:11:37
如下代码:
main函数数组用二级指针传入,func函数中,arr的值是Array首地址,也是&Array[0][0],这样*arr便是Array[0][0]的值,但是Array[0][0]的类型是float,*arr类型是float*,相当于int,gdb中p *arr命令相当于p (int)*arr,打印的是float类型的1在内存中的表示的整数值。gdb中p (float)*arr打印的就是1了
问题一:g++ 4.5.2 和vs2008打印结果都是0.000000 ***,这个是printf函数的原因?
注释掉的两行,编译报错: invalid cast from 'float*' to 'float'
问题二:针对func函数,如果规定第二个参数传入类型必须是float**,在函数内部该怎么访问每个成员

#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

void func(const int n, float** arr)
{
int i, j;

for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%f ", *(arr + i*n + j));
}
//float a = (float)*arr;
//printf("%f", a);
printf("\n");
}
}

int main()
{
float Array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

func(3, (float**)Array);

return 0;
}
...全文
476 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-05-28
  • 打赏
  • 举报
回复
仅供参考
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
NeDong 2014-05-28
  • 打赏
  • 举报
回复
引用 5 楼 zfq559 的回复:
这个方法用g++可以正常通过运行。在强制转换那行,vs2005却报错:1>error C2440: '=' : cannot convert from 'float (*)[1]' to 'float (*)[]' float (*tmp)[n] = NULL; tmp = (float(*)[n])win;
这个是因为n是变量,不是常量,把n改为3可以在vs2005通过,但是这样就把数组下标写死了,而要求又是main函数数组下标可变。。。。艹啊
NeDong 2014-05-28
  • 打赏
  • 举报
回复
引用 3 楼 anshiny 的回复:
做一个类型转换就可以了吧:
void func(const int n, float ** arr) {
	int i, j;
	float(*p)[3];
	p = (float(*)[3])arr;
	for (i=0; i<n; i++)	{
		for (j=0; j<n; j++)	{
			printf("%f ", *(*(p + i) + j));
		}
		printf("\n");
	}
}
这个方法用g++可以正常通过运行。在强制转换那行,vs2005却报错:1>error C2440: '=' : cannot convert from 'float (*)[1]' to 'float (*)[]' float (*tmp)[n] = NULL; tmp = (float(*)[n])win;
lin5161678 2014-05-28
  • 打赏
  • 举报
回复
做不到的 别作死了 数组不是指针 他们的关系不是这样
anshiny 2014-05-28
  • 打赏
  • 举报
回复
做一个类型转换就可以了吧:
void func(const int n, float ** arr) {
	int i, j;
	float(*p)[3];
	p = (float(*)[3])arr;
	for (i=0; i<n; i++)	{
		for (j=0; j<n; j++)	{
			printf("%f ", *(*(p + i) + j));
		}
		printf("\n");
	}
}
NeDong 2014-05-28
  • 打赏
  • 举报
回复
木有回答。。。各位前辈,小弟新手,求指教啊
Morrisss_ 2014-05-28
  • 打赏
  • 举报
回复
C++里可不能用二维数组转二级指针。给你个参考吧: http://blog.csdn.net/tobebetterprogrammer/article/details/18260029
lm_whales 2014-05-28
  • 打赏
  • 举报
回复
哦 valarray不知道,可否嵌套
lm_whales 2014-05-28
  • 打赏
  • 举报
回复
1)C 用一级指针,传递任何维数的数组,都很方便 2)C++可以用函数模板,数组引用传递多维数组 3)C,C++都可以动态分配内存,作为多维数组使用 4)C++标准库的容器,vector,array,甚至valarray 都可以当做多维数组使用。。。都是可嵌套的。 除此之外, 也还有几种方法传递多维数组, 或者多维数组数据, 不过更加不方便,不好用,不灵活。
j8daxue 2014-05-28
  • 打赏
  • 举报
回复
引用 6 楼 zfq559 的回复:
[quote=引用 5 楼 zfq559 的回复:] 这个方法用g++可以正常通过运行。在强制转换那行,vs2005却报错:1>error C2440: '=' : cannot convert from 'float (*)[1]' to 'float (*)[]' float (*tmp)[n] = NULL; tmp = (float(*)[n])win;
这个是因为n是变量,不是常量,把n改为3可以在vs2005通过,但是这样就把数组下标写死了,而要求又是main函数数组下标可变。。。。艹啊[/quote]

template<int n>
void foo(int (*a)[n], int m)
{
    for(int i = 0 ; i < n ; ++ i)
        for(int j = 0 ; j < m ; ++ j)
            cout<<a[i][j];     
}

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧