C语言指针指向一维数组与二维数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针指向一维数组与二维数组?相关的知识,希望对你有一定的参考价值。
请问高人,想定义一个指针指向一个一维/二维数组,
(一)
double *a;
double data[3]= 1,2,3;
a = data;
编译正确
(二)
double *a;
double data[3][3] = 1,2,3, 4,5,6, 7,8,9;
a = data;
编译出错:
error #515: a value of type "double (*)[3]" cannot be assigned to an entity of type "double *"
(三)
double data[3][3] = 1,2,3, 4,5,6, 7,8,9;
double *a = data;
编译正确
请问:
(1)(一)中指向一维数组对了,(二)中指向二维数组为什么不对?
(2)(三)和(二)不是一个意思么?为什么一个对一个错?
3和2是一样的,也是会报错的。
可以使用行指针double (*p)[3]=data;指向数组第0行,也就是我们平常理解的第一行。
访问方式,假设data是i行j列,*(*(p+i)+j)就是第i行j列的元素值,也就是data[i][j]的值。
也可以使用列指针double *p = data[0]指向第0行0列,访问方式如下:
追问不好意思:
“double (*p)[3]=data;指向数组第0行”的说法好像不对?
程序如下:
double data[2][3] = 1, 2, 3, 11, 22, 33;
double (*p)[3] = data;
将(*a)[3]添加Add Watch运行结果:
(*p)[3]为什么指向了第二行第一列元素11?
且根据“double (*p)[3]=data”这一句的等号左边的意思应当是:y指针*p定义的长度为3?那怎么会有(*p)[3]、(*p)[4]、(*p)[5]?
因为内存是连续分配的,而不是说二维数组就给你分配成二维数组的样子
参考技术A(三)应该报错的:error: cannot convert ‘double (*)[3]’ to ‘double*’ in initialization.
先回答(2):其实(二)和(三)一个意思,都不正确。(三)在你那里不报错估计是编译器环境的原因。
对于问题(1),在于能否正确理解二维数组名的含义。
二维数组名data表示第0行的地址;*data表示data[0][0]的地址;而**data才表示data[0][0]的值。
可以看一下该博文:二维数组中数组名与其指针的关系
本回答被提问者采纳如何利用memcpy将二维指针复制给一维指针?
int *tmp1;
int **tmp2;
int *tmp3;
tmp1 = new int[3*4];
tmp2 = new int *[3];
for (int i=0; i<3; i++)
tmp2[i] = new int[4];
for (int i=0; i<3; i++)
for (int j=0; j<4;j++)
tmp2[i][j]=i*4+j;
memcpy(tmp1,tmp2,3*4*sizeof(int))
代码可以运行,但是tmp1没有被赋值,请问:如何将二维指针tmp2通过memcpy函数复制给一维指针tmp1?
非常感谢~
很简单啊,就跟你分配空间的顺序一样啊:
for (int i=0; i<3; ++i)memcpy( tmp1 + (i*4), tmp2[i], 4*sizeof(int) );
这样就可以了,注意把指针的位置找对就好。 参考技术A 原来是这种二级指针而不是二维数组……
弄个循环(是一个),计算好位置,然后一次一次复制
for(int i = 0; i < 3; ++i)
memcpy(&tmp1[i*4], tmp2[i], 4 * sizeof(int));
以上是关于C语言指针指向一维数组与二维数组?的主要内容,如果未能解决你的问题,请参考以下文章