C에서 포인터로 2D 배열을 전달하는 방법은 무엇입니까?
저는 C를 배우고 있는데 2D 배열의 포인터를 2D 배열을 인쇄하는 다른 함수로 전달하는 데 어려움을 겪고 있습니다.어떤 도움이라도 주시면 감사하겠습니다.
int main( void ){
char array[50][50];
int SIZE;
...call function to fill array... this part works.
printarray( array, SIZE );
}
void printarray( char **array, int SIZE ){
int i;
int j;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", array[j][i] );
}
printf( "\n" );
}
}
char **
2D 배열을 나타내지 않습니다. 포인터에 대한 포인터 배열입니다.의 정의를 변경해야 합니다.printarray
2D 배열을 전달하려는 경우:
void printarray( char (*array)[50], int SIZE )
또는 동등한 값:
void printarray( char array[][50], int SIZE )
인main()
변수 "array"는 다음과 같이 선언됩니다.
char array[50][50];
이것은 2500바이트의 데이터입니다.언제main()
의 "array"가 전달됩니다. 이는 해당 데이터의 시작 부분에 대한 포인터입니다.50개 행으로 구성될 것으로 예상되는 차트에 대한 포인터입니다.
아직 작동 중입니다.printarray()
당신이 선언하는
char **array
여기 "array"는 다음에 대한 포인터입니다.char *pointer
.
@의 루커스 제안void printarray( char array[][50], int SIZE )
SIZE 매개 변수가 50이어야 한다는 점에서 일반적이지 않다는 점을 제외하면 작동합니다.
아이디어: 매개 변수 배열 유형을 제거합니다(예치).printarray()
void printarray(void *array, int SIZE ){
int i;
int j;
char *charArray = (char *) array;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", charArray[j*SIZE + i] );
}
printf( "\n" );
}
}
보다 우아한 솔루션은 "어레이"를 다음과 같이 만드는 것입니다.main()
일렬로 늘어선 포인터
// Your original printarray()
void printarray(char **array, int SIZE ){
int i;
int j;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", array[j][i] );
}
printf( "\n" );
}
}
// main()
char **array;
int SIZE;
// Initialization of SIZE is not shown, but let's assume SIZE = 50;
// Allocate table
array = (char **) malloc(SIZE * sizeof(char*));
// Note: cleaner alternative syntax
// array = malloc(sizeof *array * SIZE);
// Allocate rows
for (int row = 0; row<SIZE; row++) {
// Note: sizeof(char) is 1. (@Carl Norum)
// Shown here to help show difference between this malloc() and the above one.
array[row] = (char *) malloc(SIZE * sizeof(char));
// Note: cleaner alternative syntax
// array[row] = malloc(sizeof(**array) * SIZE);
}
// Initialize each element.
for (int row = 0; row<SIZE; row++) {
for (int col = 0; col<SIZE; col++) {
array[row][col] = 'a'; // or whatever value you want
}
}
// Print it
printarray(array, SIZE);
...
C99는 동적 크기의 어레이를 지원하므로 2-dim 어레이를 통과하는 데 다음 스타일이 더 편리합니다.
void printarray( void *array0, int SIZE ){
char (*array)[SIZE] = array0;
int i;
int j;
for( j = 0; j < SIZE; j++ ){
for( i = 0; i < SIZE; i ++){
printf( "%c ", array[j][i] );
}
printf( "\n" );
}
}
여기에 제가 찾던 답이 없어서, 저는 문제에 대한 간단한 해결책을 게시합니다.
#include <iostream>
using namespace std;
void example(int* mat, int dim0, int dim1){
for(int i = 0; i < dim0; ++i) {
for(int j = 0; j < dim1; ++j) {
auto cur_index = i * dim1 + j;
cout<< *(mat + cur_index) << endl;
}
}
}
int main()
{
const int dim0 = 3;
const int dim1 = 2;
int mat[dim0][dim1];
for(int i = 0; i < dim0; ++i) {
for(int j = 0; j < dim1; ++j) {
mat[i][j] = i * dim1 + j;
}
}
example(&(mat[0][0]), dim0, dim1);
return 0;
}
이중 포인터를 사용하여 2D 배열을 쉽게 전달할 수 있습니다.
void printarray( char **array, int n)
{
int i, j;
for(i=0; i<n; i++ )
{
for(j=0; j<n; j++)
{
printf("%c ", array[i][j] );
}
printf( "\n" );
}
}
int main()
{
int n = 2;
int i, j;
char **array = (char **) malloc(n * sizeof(char*));
for (i=0; i<n; i++)
{
array[i] = (char *) malloc(n* sizeof(char));
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
scanf("%c ", &array[i][j]);
}
}
printarray(array, n);
return 0;
}
전체 코드 : Ideone
언급URL : https://stackoverflow.com/questions/16724368/how-to-pass-a-2d-array-by-pointer-in-c
'it-source' 카테고리의 다른 글
매우 큰 테이블을 데이터 프레임으로 신속하게 읽기 (0) | 2023.06.15 |
---|---|
rbenv 루비 버전을 변경하지 않음 (0) | 2023.06.15 |
런타임에 메서드가 정의된 위치를 찾는 방법은 무엇입니까? (0) | 2023.06.15 |
유효성 검사 시 추가 실행을 중지하는 매크로 (0) | 2023.06.15 |
rreplace - 문자열에서 마지막으로 나타나는 식을 바꾸는 방법은 무엇입니까? (0) | 2023.06.15 |