二维数组在 内存中 是 按行存储的,
如你这个二维数组:
16 27 8 -6
-17 21 5 19
66 9 58 86
在内存中实际是这样存储的
16 27 8 -6 -17 21 5 19 66 9 58 86
主函数中传的 arr[0] 实际上是 行指针,对应 arr[0][0] = 16 的首地址。
然后 sum_array实际上是求 这些 数的总和,即 292
这个要从数组在内存中的地址来进行分析了,实际上程序的意思是二维数组所有元素的和,结果就出来!数组内存分析可以私聊!
没有什么转变这回事
二维数组就是二维数组,一维数组就是一维数组
只不过c语言不会判断访问越界
而数组是顺序表,地址是连续的
当你定义一个3x4的数组,用二维方式访问下标是这样的
0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
那么按一维方式访问就是这样的
0 1 2 3
4 5 6 7
8 9 10 11
-=-=-=-=
注意你传入的实参不是arr而是arr[0]
而你打印的也不是s而是a[i],后面99访问早已越界,是个随机数
#include <stdio.h>
void test(int(*p)[3]) /*一维数组名接收*/
{
for (int j = 0; j < 3; j++)
{
printf("%d ", (*p)[j]);
}
printf("\n");
}
void test1(int(*p)[5])/*二维数组名接收*/
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", (*(p + i))[j]);
}
printf("\n");
}
}
int main()
{
int arr1[3] = { 1, 2, 3 };
//一个数组
int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
test(&arr1);//传的数组地址;
test1(arr);//传的是一维的数组地址(二维数组本质上是多个一维数组连接在一起储存)
return 0;
}
/*运行结果:
1 2 3
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
*/
解释:
一维数组: &arr这个代表数组地址,不是首元素地址,而数组地址一般用数组指针接收,因为数组指针指向数组
p是指针,p等于&arr, 所以
*p
就等于arr, arr[] 就等于(*p)[]
二维数组:arr可以理解为就等于&arr,只是没有&. 就相当于 p = &arr,只是写的时候没有&
所以
*p
就是二维数组中真正的首元素地址,即第一个元素地址.在上面程序中i是行,所以*(p+i)
就是下一行中的第一个元素地址.所以
*(p+i) + j
就是第i行j列的某一个元素地址,所以*(*(p+i) + j)
就是i行j列某一个具体元素 也可以写成(*(p+i))[j]
解答:
将二维数组转换为一维数组可以使用for循环或者指针的方式进行操作。具体操作流程如下:
1.先确定一维数组的长度,即将二维数组全部元素放到一维数组中的总个数。
2.定义一维数组并进行动态分配内存。
3.使用for循环或者指针的方式遍历二维数组中的每个元素,并依次存储到一维数组中。
4.对于数组中的每个元素,在一维数组中的存储方式要与二维数组的存储方式一致。
需要注意的问题如下:
1.在进行地址传递时,不应该将二维数组中所有的数字都输入到一维数组中,因为在二维数组中每一行的元素个数可能是不同的,如果全部输入可能会导致数组越界。
2.在将二维数组转换为一维数组时,需要对数组进行动态分配内存,否则容易造成内存泄漏或溢出等问题。
以下是一段使用指针的方式将二维数组转换为一维数组的示例代码:
int main()
{
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int *oneArr;
oneArr = (int*)malloc(sizeof(int) * 3 * 4); //分配内存
int i, j;
for(i = 0; i < 3; i++) {
for(j = 0; j < 4; j++) {
*(oneArr + i*4 + j) = arr[i][j];
}
}
for(i = 0; i < 12; i++) {
printf("%d", *(oneArr + i)); //遍历输出一维数组
}
free(oneArr); //释放内存
return 0;
}
以上代码通过指针的方式遍历二维数组中的每个元素,并将其存储到一维数组中,最后遍历输出一维数组的元素。
另外,需要注意在给一维数组分配内存时,要注意动态分配内存的方式。在C语言中可以使用malloc或calloc函数动态分配内存,使用完记得释放内存。
结果就是把这些数字加在一起,应该是292