C:二维数组的大小
C: Size of two dimensional array
我需要一些帮助来计算二维数组的行数和列数。我好像不会数列?
#include <stdio.h>
int main() {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
int row = sizeof(result) / sizeof(result[0]);
int column = sizeof(result[0])/row;
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
输出:
行数:10
列数:0
这是整数除法的问题!
int column = sizeof(result[0])/row;
应该是
int column = 7 / 10;
并且在整数除法中,7/10==0
。
你想要做的是划分一行的长度,例如。 sizeof(result[0])
按该行的一个元素的大小,例如。 sizeof(result[0][0])
:
int column = sizeof(result[0])/sizeof(result[0][0]);
这对我有用(评论解释了为什么):
#include <stdio.h>
int main() {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
// 'total' will be 70 = 10 * 7
int total = sizeof(result);
// 'column' will be 7 = size of first row
int column = sizeof(result[0]);
// 'row' will be 10 = 70 / 7
int row = total / column;
printf("Total fields: %d\n", total);
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
输出为:
Total of fields: 70
Number of rows: 10
Number of columns: 7
编辑:
正如@AnorZaken 所指出的,将数组作为参数传递给函数并在其上打印 sizeof
的结果,将输出另一个 total
。这是因为当您将数组作为参数(而不是指向它的指针)传递时,C 会将其作为副本传递并在两者之间应用一些 C 魔法,因此您传递的并不与您认为的完全相同。为了确定您在做什么并避免一些额外的 CPU 工作和内存消耗,最好通过引用(使用指针)传递数组和对象。所以你可以使用这样的东西,与原来的结果相同:
#include <stdio.h>
void foo(char (*result)[10][7])
{
// 'total' will be 70 = 10 * 7
int total = sizeof(*result);
// 'column' will be 7 = size of first row
int column = sizeof((*result)[0]);
// 'row' will be 10 = 70 / 7
int row = total / column;
printf("Total fields: %d\n", total);
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
int main(void) {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
foo(&result);
return 0;
}
使用数组长度宏更方便(也更不容易出错):
#include <stdio.h>
#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
int main(void)
{
char result[10][7];
printf("Number of rows: %d\n", LEN(result));
printf("Number of columns: %d\n", LEN(result[0]));
return 0;
}
// gets you the total size of the 2d array
printf("Arrays Total size: %ld\n",sizeof(result));
// gets you the cumulative size of row which is 5 columns * sizeof(int)
printf("1 row cumulative size: %ld\n",sizeof(result[0]));
// division of total array size with cumulative size of row gets you total number of rows
printf("total number of rows: %ld\n",sizeof(result)/sizeof(result[0]));
// and total number of columns you get by dividing cumulative row size with sizeof(char)
printf("total number of columns: %ld\n",sizeof(result[0])/sizeof(char));
使用下面代码中显示的宏来获取 1D、2D 或 3D 数组的任意维度大小。可以类似地编写更多宏来获取 4D 数组及以后的维度。
(我知道 Wickerman 来不及看,但这些是给访问此页面的其他人的)
// Output of the following program
// [
/*
Demo of the advertised macros :
----------------------------------------------
sizeof(int) = 4
sizeof(Array_1D) = 12
ELEMENTS_IN_1D_ARRAY(Array_1D) = 3
sizeof(Array_2D) = 24
ELEMENTS_IN_2D_ARRAY(Array_2D) = 6
ROWS_IN_2D_ARRAY(Array_2D) = 2
COLUMNS_IN_2D_ARRAY(Array_2D) = 3
sizeof(Array_3D) = 96
ELEMENTS_IN_3D_ARRAY(Array_3D) = 24
MATRICES_IN_3D_ARRAY(Array_3D) = 4
ROWS_IN_3D_ARRAY(Array_3D) = 2
COLUMNS_IN_3D_ARRAY(Array_3D) = 3
Array_3D[][][] Printed :
----------------------------------------------
001 002 003
011 012 013
---------------
101 102 103
111 112 113
---------------
201 202 203
211 212 213
---------------
301 302 303
311 312 313
---------------
Wickerman's problem solved :
----------------------------------------------
sizeof(result) = 70
ELEMENTS_IN_2D_ARRAY(result) = 70
ROWS_IN_2D_ARRAY(result) = 10
COLUMNS_IN_2D_ARRAY(result) = 7
*/
// ]
// ====================================================================================================
// Program follows
// ====================================================================================================
// Array Size Macros
// [
#define ELEMENTS_IN_1D_ARRAY(a1D) ( sizeof( a1D ) / sizeof( a1D[0] )) // Total no. of elements in 1D array
#define ELEMENTS_IN_2D_ARRAY(a2D) ( sizeof( a2D ) / sizeof( a2D[0][0] )) // Total no. of elements in 2D array
#define ROWS_IN_2D_ARRAY(a2D) ( sizeof( a2D ) / sizeof( a2D[0] )) // No. of Rows in a 2D array
#define COLUMNS_IN_2D_ARRAY(a2D) ( sizeof( a2D[0] ) / sizeof( a2D[0][0] )) // No. of Columns in a 2D array
#define ELEMENTS_IN_3D_ARRAY(a3D) ( sizeof( a3D ) / sizeof( a3D[0][0][0] )) // Total no. of elements in 3D array
#define MATRICES_IN_3D_ARRAY(a3D) ( sizeof( a3D ) / sizeof( a3D[0] )) // No. of "Matrices" (aka "Slices"/"Pages") in a 3D array
#define ROWS_IN_3D_ARRAY(a3D) ( sizeof( a3D[0] ) / sizeof( a3D[0][0] )) // No. of Rows in each "Matrix" of a 3D array
#define COLUMNS_IN_3D_ARRAY(a3D) ( sizeof( a3D[0][0] ) / sizeof( a3D[0][0][0] )) // No. of Columns in each "Matrix" of a 3D array
// ]
#define PRINTF_d(s) (printf(#s " = %d\n", (int)(s))) // Macro to print a decimal no. along with its corresponding decimal expression string,
// while avoiding to write the decimal expression twice.
// Demo of the Array Size Macros defined above
// [
main()
{
// Sample array definitions
// [
int Array_1D[3] = {1, 2, 3}; // 1D array
int Array_2D[2][3] = // 2D array
{
{1, 2, 3},
{11, 12, 13}
};
int Array_3D[4][2][3] = // 3D Array
{
{
{1, 2, 3},
{11, 12, 13}
},
{
{101, 102, 103},
{111, 112, 113}
},
{
{201, 202, 203},
{211, 212, 213}
},
{
{301, 302, 303},
{311, 312, 313}
}
};
// ]
// Printing sizes and dimensions of arrays with the advertised Array Size Macros
printf(
"Demo of the advertised macros :\n"
"----------------------------------------------\n");
PRINTF_d(sizeof(int));
PRINTF_d(sizeof(Array_1D));
PRINTF_d(ELEMENTS_IN_1D_ARRAY(Array_1D));
PRINTF_d(sizeof(Array_2D));
PRINTF_d(ELEMENTS_IN_2D_ARRAY(Array_2D));
PRINTF_d(ROWS_IN_2D_ARRAY(Array_2D));
PRINTF_d(COLUMNS_IN_2D_ARRAY(Array_2D));
PRINTF_d(sizeof(Array_3D));
PRINTF_d(ELEMENTS_IN_3D_ARRAY(Array_3D));
PRINTF_d(MATRICES_IN_3D_ARRAY(Array_3D));
PRINTF_d(ROWS_IN_3D_ARRAY(Array_3D));
PRINTF_d(COLUMNS_IN_3D_ARRAY(Array_3D));
// Printing all elements in Array_3D using advertised macros
// [
int x, y, z;
printf(
"\nArray_3D[][][] Printed :\n"
"----------------------------------------------\n");
for(x = 0; x < MATRICES_IN_3D_ARRAY(Array_3D); x++)
{
for(y = 0; y < ROWS_IN_3D_ARRAY(Array_3D); y++)
{
for(z = 0; z < COLUMNS_IN_3D_ARRAY(Array_3D); z++)
printf("%4.3i", Array_3D[x][y][z]);
putchar('\n');
}
printf("---------------\n");
}
// ]
// Applying those macros to solve the originally stated problem by Wickerman
// [
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
printf(
"\nWickerman's problem solved :\n"
"----------------------------------------------\n");
PRINTF_d(sizeof(result)); // radha_SIZEOF_2D_ARRAY
PRINTF_d(ELEMENTS_IN_2D_ARRAY(result)); // radha_SIZEOF_2D_ARRAY
PRINTF_d(ROWS_IN_2D_ARRAY(result));
PRINTF_d(COLUMNS_IN_2D_ARRAY(result));
// ]
}
// ]
其他答案很好地解释了这个概念,但对初学者不友好;所以这是我的版本 -
#include <stdio.h>
void main() {
int arr [][3] = { {1,2,3 },
{4,5,6} };
int size_row = sizeof(arr)/sizeof(arr[0]);
int size_col = sizeof(arr[0])/sizeof(arr[0][0]);
printf("Length of row : %d\n",size_row); *Output 24*
printf("Length of column : %d",size_col); *Output 3*
printf("\nTotal size of array : %d",sizeof(arr)); *Output 24*
printf("\nSize of entire first row : %d",sizeof(arr[0])); *Output 12*
printf("\nSize of first element of first row : %d",sizeof(arr[0][0])); *Output 3*
}
我需要一些帮助来计算二维数组的行数和列数。我好像不会数列?
#include <stdio.h>
int main() {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
int row = sizeof(result) / sizeof(result[0]);
int column = sizeof(result[0])/row;
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
输出:
行数:10
列数:0
这是整数除法的问题!
int column = sizeof(result[0])/row;
应该是
int column = 7 / 10;
并且在整数除法中,7/10==0
。
你想要做的是划分一行的长度,例如。 sizeof(result[0])
按该行的一个元素的大小,例如。 sizeof(result[0][0])
:
int column = sizeof(result[0])/sizeof(result[0][0]);
这对我有用(评论解释了为什么):
#include <stdio.h>
int main() {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
// 'total' will be 70 = 10 * 7
int total = sizeof(result);
// 'column' will be 7 = size of first row
int column = sizeof(result[0]);
// 'row' will be 10 = 70 / 7
int row = total / column;
printf("Total fields: %d\n", total);
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
输出为:
Total of fields: 70
Number of rows: 10
Number of columns: 7
编辑:
正如@AnorZaken 所指出的,将数组作为参数传递给函数并在其上打印 sizeof
的结果,将输出另一个 total
。这是因为当您将数组作为参数(而不是指向它的指针)传递时,C 会将其作为副本传递并在两者之间应用一些 C 魔法,因此您传递的并不与您认为的完全相同。为了确定您在做什么并避免一些额外的 CPU 工作和内存消耗,最好通过引用(使用指针)传递数组和对象。所以你可以使用这样的东西,与原来的结果相同:
#include <stdio.h>
void foo(char (*result)[10][7])
{
// 'total' will be 70 = 10 * 7
int total = sizeof(*result);
// 'column' will be 7 = size of first row
int column = sizeof((*result)[0]);
// 'row' will be 10 = 70 / 7
int row = total / column;
printf("Total fields: %d\n", total);
printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);
}
int main(void) {
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
foo(&result);
return 0;
}
使用数组长度宏更方便(也更不容易出错):
#include <stdio.h>
#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))
int main(void)
{
char result[10][7];
printf("Number of rows: %d\n", LEN(result));
printf("Number of columns: %d\n", LEN(result[0]));
return 0;
}
// gets you the total size of the 2d array
printf("Arrays Total size: %ld\n",sizeof(result));
// gets you the cumulative size of row which is 5 columns * sizeof(int)
printf("1 row cumulative size: %ld\n",sizeof(result[0]));
// division of total array size with cumulative size of row gets you total number of rows
printf("total number of rows: %ld\n",sizeof(result)/sizeof(result[0]));
// and total number of columns you get by dividing cumulative row size with sizeof(char)
printf("total number of columns: %ld\n",sizeof(result[0])/sizeof(char));
使用下面代码中显示的宏来获取 1D、2D 或 3D 数组的任意维度大小。可以类似地编写更多宏来获取 4D 数组及以后的维度。 (我知道 Wickerman 来不及看,但这些是给访问此页面的其他人的)
// Output of the following program
// [
/*
Demo of the advertised macros :
----------------------------------------------
sizeof(int) = 4
sizeof(Array_1D) = 12
ELEMENTS_IN_1D_ARRAY(Array_1D) = 3
sizeof(Array_2D) = 24
ELEMENTS_IN_2D_ARRAY(Array_2D) = 6
ROWS_IN_2D_ARRAY(Array_2D) = 2
COLUMNS_IN_2D_ARRAY(Array_2D) = 3
sizeof(Array_3D) = 96
ELEMENTS_IN_3D_ARRAY(Array_3D) = 24
MATRICES_IN_3D_ARRAY(Array_3D) = 4
ROWS_IN_3D_ARRAY(Array_3D) = 2
COLUMNS_IN_3D_ARRAY(Array_3D) = 3
Array_3D[][][] Printed :
----------------------------------------------
001 002 003
011 012 013
---------------
101 102 103
111 112 113
---------------
201 202 203
211 212 213
---------------
301 302 303
311 312 313
---------------
Wickerman's problem solved :
----------------------------------------------
sizeof(result) = 70
ELEMENTS_IN_2D_ARRAY(result) = 70
ROWS_IN_2D_ARRAY(result) = 10
COLUMNS_IN_2D_ARRAY(result) = 7
*/
// ]
// ====================================================================================================
// Program follows
// ====================================================================================================
// Array Size Macros
// [
#define ELEMENTS_IN_1D_ARRAY(a1D) ( sizeof( a1D ) / sizeof( a1D[0] )) // Total no. of elements in 1D array
#define ELEMENTS_IN_2D_ARRAY(a2D) ( sizeof( a2D ) / sizeof( a2D[0][0] )) // Total no. of elements in 2D array
#define ROWS_IN_2D_ARRAY(a2D) ( sizeof( a2D ) / sizeof( a2D[0] )) // No. of Rows in a 2D array
#define COLUMNS_IN_2D_ARRAY(a2D) ( sizeof( a2D[0] ) / sizeof( a2D[0][0] )) // No. of Columns in a 2D array
#define ELEMENTS_IN_3D_ARRAY(a3D) ( sizeof( a3D ) / sizeof( a3D[0][0][0] )) // Total no. of elements in 3D array
#define MATRICES_IN_3D_ARRAY(a3D) ( sizeof( a3D ) / sizeof( a3D[0] )) // No. of "Matrices" (aka "Slices"/"Pages") in a 3D array
#define ROWS_IN_3D_ARRAY(a3D) ( sizeof( a3D[0] ) / sizeof( a3D[0][0] )) // No. of Rows in each "Matrix" of a 3D array
#define COLUMNS_IN_3D_ARRAY(a3D) ( sizeof( a3D[0][0] ) / sizeof( a3D[0][0][0] )) // No. of Columns in each "Matrix" of a 3D array
// ]
#define PRINTF_d(s) (printf(#s " = %d\n", (int)(s))) // Macro to print a decimal no. along with its corresponding decimal expression string,
// while avoiding to write the decimal expression twice.
// Demo of the Array Size Macros defined above
// [
main()
{
// Sample array definitions
// [
int Array_1D[3] = {1, 2, 3}; // 1D array
int Array_2D[2][3] = // 2D array
{
{1, 2, 3},
{11, 12, 13}
};
int Array_3D[4][2][3] = // 3D Array
{
{
{1, 2, 3},
{11, 12, 13}
},
{
{101, 102, 103},
{111, 112, 113}
},
{
{201, 202, 203},
{211, 212, 213}
},
{
{301, 302, 303},
{311, 312, 313}
}
};
// ]
// Printing sizes and dimensions of arrays with the advertised Array Size Macros
printf(
"Demo of the advertised macros :\n"
"----------------------------------------------\n");
PRINTF_d(sizeof(int));
PRINTF_d(sizeof(Array_1D));
PRINTF_d(ELEMENTS_IN_1D_ARRAY(Array_1D));
PRINTF_d(sizeof(Array_2D));
PRINTF_d(ELEMENTS_IN_2D_ARRAY(Array_2D));
PRINTF_d(ROWS_IN_2D_ARRAY(Array_2D));
PRINTF_d(COLUMNS_IN_2D_ARRAY(Array_2D));
PRINTF_d(sizeof(Array_3D));
PRINTF_d(ELEMENTS_IN_3D_ARRAY(Array_3D));
PRINTF_d(MATRICES_IN_3D_ARRAY(Array_3D));
PRINTF_d(ROWS_IN_3D_ARRAY(Array_3D));
PRINTF_d(COLUMNS_IN_3D_ARRAY(Array_3D));
// Printing all elements in Array_3D using advertised macros
// [
int x, y, z;
printf(
"\nArray_3D[][][] Printed :\n"
"----------------------------------------------\n");
for(x = 0; x < MATRICES_IN_3D_ARRAY(Array_3D); x++)
{
for(y = 0; y < ROWS_IN_3D_ARRAY(Array_3D); y++)
{
for(z = 0; z < COLUMNS_IN_3D_ARRAY(Array_3D); z++)
printf("%4.3i", Array_3D[x][y][z]);
putchar('\n');
}
printf("---------------\n");
}
// ]
// Applying those macros to solve the originally stated problem by Wickerman
// [
char result[10][7] = {
{'1','X','2','X','2','1','1'},
{'X','1','1','2','2','1','1'},
{'X','1','1','2','2','1','1'},
{'1','X','2','X','2','2','2'},
{'1','X','1','X','1','X','2'},
{'1','X','2','X','2','1','1'},
{'1','X','2','2','1','X','1'},
{'1','X','2','X','2','1','X'},
{'1','1','1','X','2','2','1'},
{'1','X','2','X','2','1','1'}
};
printf(
"\nWickerman's problem solved :\n"
"----------------------------------------------\n");
PRINTF_d(sizeof(result)); // radha_SIZEOF_2D_ARRAY
PRINTF_d(ELEMENTS_IN_2D_ARRAY(result)); // radha_SIZEOF_2D_ARRAY
PRINTF_d(ROWS_IN_2D_ARRAY(result));
PRINTF_d(COLUMNS_IN_2D_ARRAY(result));
// ]
}
// ]
其他答案很好地解释了这个概念,但对初学者不友好;所以这是我的版本 -
#include <stdio.h>
void main() {
int arr [][3] = { {1,2,3 },
{4,5,6} };
int size_row = sizeof(arr)/sizeof(arr[0]);
int size_col = sizeof(arr[0])/sizeof(arr[0][0]);
printf("Length of row : %d\n",size_row); *Output 24*
printf("Length of column : %d",size_col); *Output 3*
printf("\nTotal size of array : %d",sizeof(arr)); *Output 24*
printf("\nSize of entire first row : %d",sizeof(arr[0])); *Output 12*
printf("\nSize of first element of first row : %d",sizeof(arr[0][0])); *Output 3*
}