memcpy()对二维数组和二维指针操作的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memcpy()对二维数组和二维指针操作的区别相关的知识,希望对你有一定的参考价值。

数组定义的空间是连续的,并且长度等于你定义的数量
你的那个二维指针的空间不一定是连续的,并且使用的空间比你定义的要大
以char[2,3]叔祖和二维指针为例,地址都从0x1000看是
数组空间地址:
dataout[0][0]:0x1000
dataout[0][1]:0x1001
dataout[0][2]:0x1002
dataout[1][0]:0x1003
dataout[1][1]:0x1004
dataout[1][2]:0x1005
二维指针:
pdataout[0]:0x1000
pdataout[1]:0x1004
pdataout[0][1]:0x1018
pdataout[0][2]:0x1019
pdataout[0][3]:0x101a
pdataout[1][1]:0x1024
pdataout[1][2]:0x1025
pdataout[1][3]:0x1026

0x1000 0x100
参考技术A 二维数组如果是一行一行存的话会把那些一行一行的复制过去,二维指针的话会把指针复制过去,每条指针指向的数组要单独复制。

如何利用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));

以上是关于memcpy()对二维数组和二维指针操作的区别的主要内容,如果未能解决你的问题,请参考以下文章

C语言中怎么把一维数组赋给另外一个一维数组

c语言二维数组 赋值

c语言中如何通过二级指针来操作二维数组

VC中如何将一个二维数组的值赋给另一个二维数组?只能用一行。

c++指针数组与二维数组的最大区别

二维数组和指针