二维数组的赋值问题

Posted

tags:

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

问题:二维数组中数字的分布---部分元素赋值
第一个问题:如:int a[3][4]=1,5,9,10;数字的分布或赋值方式为:将1赋值给a[0][0],将5赋值给a[1][0],将9赋值给a[2][0],将10赋值给a[2][1],数组的其他元素赋值为0,即
a[0][0]=1,a[1][0]=5,a[2][0]=9,a[2][1]=10,其他为0
但是我不清楚int a[3][4]=1,5,9,10的赋值方式,是不是逐个分别赋值----a[0][0]=1,a[0][1]=5,
a[0][2]=9,a[1][0]=10,其他的为0,我想是这样的,但不知道对不对?
第二个问题:如果是二维字符数组呢,如char xx[4][10]="adfd","dfc","dfadf","fdalipe",它的赋值情况又是如何呢?就拿这个xx字符串数组来说,其具体的赋值方式是什么?特别是第二个问题,一定要说清楚啊!一样不明白啊!

1.C/C++中数组是不能整体赋值的,只能声明时附带初始化。初始化是编译期行为,而赋值是运行期行为,两者是严格不同的。
int a[3][4]=1,5,9,10;
左边是int [3][4]类型,右边是int []类型,初始化列表和初始化变量类型不匹配,会出现编译警告。
不过关于值的问题,LZ的想法基本正确。初始化中按地址顺序复制初始化列表的值给数组元素。不过要注意,如果不初始化,数组的值将是随机数(除非数组是全局变量或静态变量,会自动初始化为0)。
2.注意C中的“多维”数组实际是数组的数组(……的数组)。因此char xx[4][10]的元素是4个char [10]类型的变量。这里的初始化中是把
"adfd","dfc","dfadf","fdalipe"分别放到xx[0]、xx[1]、xx[2]、xx[3]中。
xx[0]之类作为一个char [10]类型的变量,即char类型定长数组,可以容纳一个长度小于10的字符串,所以这里的的初始化是合法的。每个字符串常量用于初始化时,把各个字符按连续地址顺序依次复制到目标变量的对应位置中,遇到字符串结尾编译器会自动在后面补'\0'。这里只要进行了初始化,变量中余下的未被初始化字符串覆盖的空间会在初始化前预先置为0(即'\0'、NULL)。
所以这里变量xx经过初始化后内容应该为:
'a','d','f','d','\0',0,0,0,0,0,
'd','f','c','\0',0,0,0,0,0,0,
'd','f','a','d','f','\0',0,0,0,0,
'f','d','a','l','i','p','e','\0',0,0
注意0和'\0'是相同的值,这里为了使未被初始化的部分和被字符串覆盖的部分有所区分,所以特意这样表示。
----
[原创回答团]

参考资料:原创

参考技术A 二维数组岂能如此赋值?不嫌麻烦吗?
你的这种方法涉及到三维数组你会更头晕的^^
这种方法只适合小型数组。

建议用镶嵌循环赋值:

For 横栏=1 to 100
For 纵栏=1 to 100
....
....
Next
Next
参考技术B 第一个问题,你是对的

第二个问题,xx的空间是这样的
a,d,f,d,\0,未赋值,未赋值,未赋值,未赋值,未赋值,
d,f,c,\0,未赋值,未赋值,未赋值,未赋值,未赋值,未赋值,
d,f,a,d,f,\0,未赋值,未赋值,未赋值,未赋值,
f,d,a,l,i,p,e,\0,未赋值,未赋值

C++二维数组给一维数组赋值

比如我有个数组
char a[3][3] = 1,2,3,4,5,6,7,8,9;
如何把这个数组赋值给数组
char b[3];
b为123,456,789

二维数组给一维数组赋值有两种情况:

1 按元素,逐个赋值到对应目标元素上。

适用于所有情况,可以自定义规则,遍历二维数组,并赋值到一维数组的对应位置上。由二维数组的行列值计算出一维数组的偏移量,这部分算法可以随意设计,有很高的灵活度。

比如,将二维数组第一列复制出来称为一个单独的一维数组,可以写作:

int a[100][100], b[100];
int i;
//二维数组赋值操作可以写在这里,与主题无关,代码从略。
for(i = 0; i < 100; i ++)
    b[i] = a[i][0];//第一列即0列,C语言下标从0开始。

2 整体复制。

二维数组中的元素本身是连续存储的,如果要将二维数组连续的一组数据赋值给一维数组,可以直接调用memcpy函数。该函数声明在cstring中,形式为

void* memcpy(void *dst, void *src, size_t length);

功能为将src地址上,长度为length字节的数据,复制到dst地址上。

比如将第二三两行(这两行是连续的),复制到一维数组中,代码可以写作:

int a[100][100],b[200];
//赋值,从略。
memcpy(b,a[1],sizeof(b));//整体复制。
参考技术A char b[3]; b的元素是char,456和789对于char类型的整数来说是溢出的
b是int类型的数组才行
int b[3];
int i;
for(i=0;i<3;i++)
b[i]=100*a[i][0]+10*a[i][1]+a[i][2];

这样b就是123,456,789了
参考技术B char类型的字符数组,存放整型数字,这个整型数字实际上是某个字符的ASCII码,比如41--A,42---B等。但是如果超过了ASCII中能够显示的字符范围,就会显示乱码。
建议将char b[3];修改为char *b[3]
参考技术C char b[3];
char a[3][3] = 1,2,3,4,5,6,7,8,9;
char temp[3];
for( int i = 0; i < 3; i ++)

for( int j =0; j< 3; j ++)

temp[j] = a[i][j];



b[i] = temp;
本回答被提问者采纳

以上是关于二维数组的赋值问题的主要内容,如果未能解决你的问题,请参考以下文章

易语言二维数组一次性赋值错误

JAVA中如何创建一个二维数组,然后给二维数组赋值!

二维数组名不能赋值给二级指针- -

C++二维数组给一维数组赋值

二维数组怎么赋值

vba 赋值给二维数组?