二維數組使用memcpy賦值:
//void *memcpy(void *dest, const void *src, size_t n);從源src所指的內存地址的起始位置開始拷貝n個
//字節到目標dest所指的內存地址的起始位置中。調用該函數需要引用string.h頭文件.
int a[M][N], b[M][N];
memcpy(b, a, sizeof(a));
/////////////////////////////////////////結構體中二維數組的memcpy//////
memcpy(cl_ctx->wq[0], ctx->wq[0], sizeof(cl_ctx->wq[0]));//指針在64位系統佔8個字節,ctx->wq[1]是指針,因此sizeof(ctx->wq[1])=8,故不可用
memcpy(cl_ctx->wq[1], ctx->wq[1], sizeof(cl_ctx->wq[1]));
//或者
memcpy(&cl_ctx->wq[0][0], &ctx->wq[0][0], sizeof(cl_ctx->wq));
memcpy(cl_ctx->wq, ctx->wq, sizeof(cl_ctx->wq));
//均可以.
//但是如果兩個結構體中第一個是wq[2][64],另一個是*wq[2],則只能使用上面的兩個對每個維度單獨賦值,因爲*wq[2]的第二維可能不是64.
///////////結構體數組的memcpy///////////////////////////////////////////////////
typedef struct _CL_CORE{
ENC_SBAC s_curr_before_split[MAX_CU_DEPTH][MAX_CU_DEPTH];
ENC_SBAC s_curr_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
ENC_SBAC s_next_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
ENC_CU_DATA cu_data_best[MAX_CU_DEPTH][MAX_CU_DEPTH];
ENC_CU_DATA cu_data_temp[MAX_CU_DEPTH][MAX_CU_DEPTH];
}CL_CORE;
memcpy(&cl_core->s_curr_before_split[0][0], &core->s_curr_before_split[0][0], sizeof(cl_core->s_curr_before_split));
memcpy(cl_core->s_curr_before_split, core->s_curr_before_split, sizeof(cl_core->s_curr_before_split));
例一:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void printarr2d(int (*a)[3],int row,int col);
int main()
{
int i,j;
int a[2][3] = {{1,2,3},{4,5,6}};
int b[4][3] = {{0,0,0},{0,0,0}};
memcpy(b[2],a,sizeof(int)*2*3);//b[2]代表以b[2]爲起始地址開始賦值
printarr2d(b,4,3);
return 0;
}
/***********************************************
打印顯示數組
************************************************/
void printarr2d(int (*a)[3],int row,int col)
{
int i,j;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("%d", a[i][j]);
}
printf("\n");
}
}
例二:
#include"string.h"
#include"stdio.h"
int main(void)
{
int i,j;
int a[2][3]={{1,2,3},{4,5,6}};
int b[2][3];
memcpy(&b[0][0],&a[0][0],24);
printf("%d",b[1][0]);
}
例三:
#include <stdio.h>
void print(int *data,size_t m,size_t n); //二維數組顯示子函數
int main(void)
{
int src[][3]={{1,2,3},{4,5,6},{7,8,9},{1,2,3},{4,5,6},{7,8,9}};
int des[6][3]={0,0};//要小心,行數固定
printf("%d",sizeof(src));
print(src,6,3);
memcpy(des,src,sizeof(src));
print(des,6,3);
return 1;
}
//二維子函數顯示功能
void print(int data[][3], size_t m,size_t n)
{
int i,j;
printf("\n");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{
printf("%d ",data[i][j]);
}
printf("\n");
}
}
二維數組使用malloc動態申請內存:
https://blog.csdn.net/fengxinlinux/article/details/51541003
方法一:利用二級指針申請一個二維數組。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int **a; //用二級指針動態申請二維數組
int i,j;
int m,n;
printf("請輸入行數\n");
scanf("%d",&m);
printf("請輸入列數\n");
scanf("%d",&n);
a=(int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
a[i]=(int*)malloc(sizeof(int)*n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%p\n",&a[i][j]); //輸出每個元素地址,每行的列與列之間的地址時連續的,行與行之間的地址不連續
}
}
for(i=0;i<m;i++)
free(a[i]);
free(a);
return 0;
}
方法二:用數組指針形式申請一個二維數組。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
//申請一個3行2列的整型數組
int (*a)[2]=(int(*)[2])malloc(sizeof(int)*3*2);
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
printf("%p\n",&a[i][j]); //輸出數組每個元素地址,每個元素的地址是連續的
}
}
free(a);
return 0;
}
方法三:用一個單獨的一維數組來模擬二維數組。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nrows,ncolumns;
int *Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int *)malloc(nrows*ncolumns*sizeof(int)); //申請內存空間
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i*ncolumns+j]=1;
printf("%d ",Array[i*ncolumns+j]); //用Array[i*ncolumns+j] 訪問第i,j個成員
}
printf("\n");
}
free(Array);
return 0;
}