数组指针做参数的问题。

changxiao5856 2012-11-10 06:58:39
一个函数需要一个指针参数。。我定义一个二维数组a[][],里面赋值。。然后传入&a[0][0]可以。。为什么我定义一个指针的指针float **b,b中同样赋值。。。然后传入&b[0][0]会出错呢???
如果用b传入,应该怎么写呢???谢谢了。。。
求救。。。
...全文
1195 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
yujie_v 2012-11-16
  • 打赏
  • 举报
回复
一看就没申请空间就用的。
  • 打赏
  • 举报
回复
引用 26 楼 lkp1987hf919 的回复:
引用 25 楼 goldenhawking 的回复:float ** p 和 float q[][] 是完全不同的概念啊! float ** 在内存里是首先指向的是一个存有指针的数组,这个数组存放的内容是另一个连续内存区域的起始位置,比如 地址 内容 &p[0]= 102400 p[0]= 123172 &a……
可以把代码运行一下子哦!确实是不同的位置啊!
lkp1987hf919 2012-11-14
  • 打赏
  • 举报
回复
引用 25 楼 goldenhawking 的回复:
float ** p 和 float q[][] 是完全不同的概念啊! float ** 在内存里是首先指向的是一个存有指针的数组,这个数组存放的内容是另一个连续内存区域的起始位置,比如 地址 内容 &p[0]= 102400 p[0]= 123172 &p[1]= 102404 p[1]= 146216 &a……
且 &p[0], &p[0][0] 不是一个位置 ---------------------------------------- 应该是一个位置吧,都是第一个元素的地址。。。。
  • 打赏
  • 举报
回复
float ** p 和 float q[][] 是完全不同的概念啊! float ** 在内存里是首先指向的是一个存有指针的数组,这个数组存放的内容是另一个连续内存区域的起始位置,比如 地址 内容 &p[0]= 102400 p[0]= 123172 &p[1]= 102404 p[1]= 146216 &p[2]= 102406 p[2]= 213832 &p[0][0] 123172 p[0][] = 23.23837473 ,38374.283273... &p[1][0] 146216 p[1][] = ... 也就是说,原则上,这个 p 的各个元素 p[0],p[1]可以指向若干个长度不等的内存,比如 float a[100], b[1000], c[2]; float ** p = new float * [3]; p[0] = a;p[1] = b;p[2] = c; 这种指针的步进完全取决于强制类型转换,且 &p[0], &p[0][0] 不是一个位置。 再看 q, q是个二维数组, q[3][4] 指向的是一个连续的区域,有12个float。 q 是一个指针,这个指针的步进(q+1跨越的字节)为4个 float q[3] 也是一个指针,这个指针的步进(q[3]+1跨越的字节)为1个 float 因此,这种数组的指针类型是只是步进不同,&p[0], &p[0][0]地址一样。 给个例子

	int a[3],b[4],c[5];
	a[0] = 2; a[1] = 01; a[2] = 02;
	b[0] = 3; b[1] = 11; b[2] = 12; b[3] = 13;
	c[0] = 4; c[1] = 21; c[2] = 22; c[3] = 23; c[4] = 24;
	int ** p = new int * [3];
	int q[3][4] = {
		{0,1,2,3},
		{4,5,6,7},
		{8,9,10,11}
	};

	p[0] = a;
	p[1] = b;
	p[2] = c;

	printf  ("&p = %08X, &p[0] = %08X, &p[0][0] = %08X",(unsigned int)&p, (unsigned int)&p[0], (unsigned int)&p[0][0]);
	for (int i=0;i<3;i++)
	{
		printf ("\np[%d] has %d items , p[%d][0] = %d",i,p[i][0],i,p[i][0]);
		for (int j=1;j<p[i][0];j++)
			printf (", p[%d][%d] = %02d",i,j,p[i][j]);
	}
	delete [] p;
	printf  ("\n\n&q = %08X, &q[0] = %08X, &q[0][0] = %08X",(unsigned int)&q, (unsigned int)&q[0], (unsigned int)&q[0][0]);
	for (int i=0;i<3;i++)
	{
		for (int j=0;j<4;j++)
			printf ("\nq[%d][%d] = %02d",i,j,q[i][j]);
	}
	printf ("\n\n");

运行结果

&p = 0013FF14, &p[0] = 003E3188, &p[0][0] = 0013FF54
p[0] has 2 items , p[0][0] = 2, p[0][1] = 01
p[1] has 3 items , p[1][0] = 3, p[1][1] = 11, p[1][2] = 12
p[2] has 4 items , p[2][0] = 4, p[2][1] = 21, p[2][2] = 22, p[2][3] = 23

&q = 0013FEDC, &q[0] = 0013FEDC, &q[0][0] = 0013FEDC
q[0][0] = 00
q[0][1] = 01
q[0][2] = 02
q[0][3] = 03
q[1][0] = 04
q[1][1] = 05
q[1][2] = 06
q[1][3] = 07
q[2][0] = 08
q[2][1] = 09
q[2][2] = 10
q[2][3] = 11

请按任意键继续. . .
沙勒巴基 2012-11-13
  • 打赏
  • 举报
回复
二级指针和二维数组没什么关系吧???
changxiao5856 2012-11-12
  • 打赏
  • 举报
回复
引用 19 楼 ri_aje 的回复:
引用 18 楼 changxiao5856 的回复:引用 16 楼 ri_aje 的回复:引用 14 楼 changxiao5856 的回复:是不是函数imsls_f_categorical_glm 内部实现的原因啊???…… 通常情况下首先怀疑自己的代码,除非有确凿证据显示库行为有问题。 我猜是因为 new 数组存储不连续造成的,试一下下面这样。 C/C++ co……
so cool 谢谢。。。。
sj1216 2012-11-12
  • 打赏
  • 举报
回复
大家都是牛人啊
wzb56 2012-11-12
  • 打赏
  • 举报
回复
类型不匹配吧
ri_aje 2012-11-11
  • 打赏
  • 举报
回复
引用 18 楼 changxiao5856 的回复:
引用 16 楼 ri_aje 的回复:引用 14 楼 changxiao5856 的回复:是不是函数imsls_f_categorical_glm 内部实现的原因啊???…… 通常情况下首先怀疑自己的代码,除非有确凿证据显示库行为有问题。 我猜是因为 new 数组存储不连续造成的,试一下下面这样。 C/C++ code12345678 float* xvalue =……
new 保证连续性,但是不保证多次 new 的地址空间连续性。
dhdahai 2012-11-10
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
引用 14 楼 changxiao5856 的回复:是不是函数imsls_f_categorical_glm 内部实现的原因啊???…… 通常情况下首先怀疑自己的代码,除非有确凿证据显示库行为有问题。 我猜是因为 new 数组存储不连续造成的,试一下下面这样。 C/C++ code12345678 float* xvalue = new float [32*3]; ……
嗯,这个可能性比较大!
ri_aje 2012-11-10
  • 打赏
  • 举报
回复
引用 14 楼 changxiao5856 的回复:
是不是函数imsls_f_categorical_glm 内部实现的原因啊???……
通常情况下首先怀疑自己的代码,除非有确凿证据显示库行为有问题。 我猜是因为 new 数组存储不连续造成的,试一下下面这样。

 float* xvalue = new float [32*3];
 for(int i = 0; i < 32; i++)
 for(int j = 0; j < 3 ; j++)
 {
  xvalue[i*3+j] = x[i][j];
 }
 n_coef = imsls_f_categorical_glm(n_obs,n_class,n_continuous,model,&xvalue[0],...,0);
changxiao5856 2012-11-10
  • 打赏
  • 举报
回复
把原始代码贴上来。。上面的代码我随手写的。。错误百出。。
changxiao5856 2012-11-10
  • 打赏
  • 举报
回复
n_coef = imsls_f_categorical_glm (n_obs, n_class, n_continuous,model (float*)&xvalue[0][0],IMSLS_COEF_STAT, &coef_statistics,0);这样调用就会失败。。 如果我换成 n_coef = imsls_f_categorical_glm (n_obs, n_class, n_continuous,model (float*)&x[0][0],IMSLS_COEF_STAT, &coef_statistics,0);就可以调成功。 是不是函数imsls_f_categorical_glm 内部实现的原因啊???
changxiao5856 2012-11-10
  • 打赏
  • 举报
回复
static float x[32][3] = { {110,2.62,1}, {110,2.875,1}, {93,2.32,1}, {110,3.215,0}, {175,3.44,0}, {105,3.46,0}, {245,3.57,0}, {62,3.19,0}, {95,3.15,0},{123,3.44,0},{123,3.44,0},{180,4.07,0},{180,3.73,0},{180,3.78,0},{205,5.25,0},{215,5.424,0}, {230,5.345,0},{66,2.2,1},{52,1.615,1},{65,1.835,1},{97,2.465,0},{150,3.52,0},{150,3.435,0},{245,3.84,0}, {175,3.845,0},{66,1.935,1},{91,2.14,1},{113,1.513,1},{264,3.17,1},{175,2.77,1},{335,3.57,1},{109,2.78,1}}; float *coef_statistics, criterion; float *coef_statistics_4; float *coef_statistics_5; float criterion_4; float criterion_5; //float xvalue[111138][3]; float **xvalue = new float*[32]; for(int i = 0; i < 32; i++) { xvalue[i] = new float[3];; for(int j = 0; j < 3 ;j++) { xvalue[i][j] = x[i][j]; printf ("\nli %4f \n",xvalue[0]); } } int n_obs=32, n_class=0, n_continuous=2; int n_coef,n_coef_4,n_coef_5, model=3, ipar=3; char *fmt = const_cast<char*>("%12.4f"); static char *clabels[] = {const_cast<char*>(""), const_cast<char*>("coefficients"), const_cast<char*>("s.e"), const_cast<char*>("z"), const_cast<char*>("p")}; n_coef = imsls_f_categorical_glm (n_obs, n_class, n_continuous,model (float*)&xvalue[0][0],IMSLS_COEF_STAT, &coef_statistics,0);这样调用就会失败。。 如果我换成 n_coef = imsls_f_categorical_glm (n_obs, n_class, n_continuous,model (float*)&x[0][0],IMSLS_COEF_STAT, &coef_statistics,0);就可以调成功。 是不是函数imsls_f_categorical_glm 内部实现的原因啊???
头头 2012-11-10
  • 打赏
  • 举报
回复
确实好像没有分配空间啊
chrislinn 2012-11-10
  • 打赏
  • 举报
回复
引用 10 楼 chrislinn 的回复:
引用 8 楼 dhdahai 的回复:LZ是不是没有给指针b分配空间啊? BINGO!应该是因为还没给b 分配空间,只是定义了 所以不能直接这样赋值的 引用 4 楼 changxiao5856 的回复:C/C++ code12345678float **b;for(int i = 0; i < 1;i++){ for(int j = 0; i < 2; j……
分配空间的办法 ri_aje 和 I_FU_LE_YOU11 都写出来了,照着那个改改就行了
chrislinn 2012-11-10
  • 打赏
  • 举报
回复
引用 8 楼 dhdahai 的回复:
LZ是不是没有给指针b分配空间啊?
BINGO!应该是因为还没给b 分配空间,只是定义了 所以不能直接这样赋值的
引用 4 楼 changxiao5856 的回复:
float **b;
for(int i = 0; i < 1;i++)
{
    for(int j = 0; i < 2; j++)
   {
       b[i][j] = 1.0;
    }
}
:)
changxiao5856 2012-11-10
  • 打赏
  • 举报
回复
引用 16 楼 ri_aje 的回复:
引用 14 楼 changxiao5856 的回复:是不是函数imsls_f_categorical_glm 内部实现的原因啊???…… 通常情况下首先怀疑自己的代码,除非有确凿证据显示库行为有问题。 我猜是因为 new 数组存储不连续造成的,试一下下面这样。 C/C++ code12345678 float* xvalue = new float [32*3]; ……
我感觉也是这样。。。为什么new的二位数组不可以,而一维数组可以?new的不连续,二维和一维也都不连续啊?
chrislinn 2012-11-10
  • 打赏
  • 举报
回复
引用 5 楼 I_FU_LE_YOU11 的回复:
for(int j = 0; i < 2; j++) { b[i][j] = 1; A(&b[i][j]);
这里写错了吧,第一行i 应为 j
dhdahai 2012-11-10
  • 打赏
  • 举报
回复
引用 4 楼 changxiao5856 的回复:
类似这样 A(float x*) float a[1][2] = {1.0,2.0} A(&a[0][0]);这样是可以的。。。 但是 float **b; for(int i = 0; i < 1;i++) { for(int j = 0; i < 2; j++) { b[i][j] = 1.0; ……
按道理应该是可以的,LZ是不是没有给指针b分配空间啊?
加载更多回复(7)
1) 本套课程针对高校大学生系统学习C语言而录制,从0基础入门讲起,循序渐进,通俗易懂,同时适用于计算机系及非计算机系的同学。通过学习可以帮助大家掌握C语言本质,轻松面对C语言全国二级考试,并达到能独立完成中型C项目、C游戏的水平;2) 多数高校都开设了C语言课程,网上C语言课程也很多,但普遍存在两个问题: (1) 授课方式单一,大多是照着代码念一遍, 对刚刚接触编程的同学来说,感觉晦涩难懂 (2) 授课内容过度注重语法,没有项目实战支撑,造成课程枯燥无趣。本课程针对上述问题进行了改进 (1) 授课方式采用语法讲解+内存布局示意图+项目的方式,让课程生动有趣好理解 (2) 系统全面的讲解了C语言的核心技术点,还配套录制了《全国计算机二级C语言真题精讲》,让学员在掌握C语言编程的同时,还能轻松面对二级考试;3) 课程详细内容: 常量-变量、分支语句、循环语句、操作符和表达式、函数(库函数、自定义函数、递归调用 )、数组(一维数 组、二维数组数组作为函数参数指针数组)、指针(指针指针类型、二级指针和多级指针指针表达式解析、指针运算、数 组指针、函数指针、回调函数)、调试技巧、程序环境和预处理(翻译环境、运行环境、预定义符号、#define和#undef、宏和函 数、条件编译、文件包含)、 数据在内存中的存储、内存块分配、static、字符函数和字符串函数、自定义类型(结构体、枚举 、联合)、动态内存管理、文件操作(i/o常量、i/o函数、流)。

64,637

社区成员

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

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