매개변수 int(*)[] 는 어떻게 이해해야하나요?

장은총@Facebook의 이미지

안녕하세요 오목스스 찾아보다가
아래와 같은 함수를 보게 되었는데요

void DrawBoard(int(*)[W_BOARD_SIZE]);

매개변수를 어떻게 이해해야하는건가요?
int(*)[]
int형 포인터 배열?이라고 생각해야하나요?

 의 이미지

int 포인터의 배열은 int *array_of_pointers[] 이고요.

저건 int 배열에 대한 포인터입니다.
말 그대로 배열의 주소를 전달함으로써 배열을 고스란히 매개변수로 넘겨주는 것이죠.
사실 배열은 그냥 놔두면 알아서 첫 원소를 가리키는 포인터로 변환되기 때문에, 그렇게 전달하는 방식이 더 널리 쓰이기는 합니다만,
이 방법의 장점은 배열을 받는 쪽에서 배열의 크기 정보를 타입에 남겨둘 수 있다는 것이죠.
덕분에 특히 2차원 이상의 배열을 넘겨줄 때 유용합니다.

단점이라면, 많은 사람들에게 익숙한 문법이 아니라는 거죠.

용례는 아래와 같습니다.

#include <stdio.h>
 
#define ARRAY_LEN 10
 
static void init_array(int (*)[ARRAY_LEN]);
static void print_array(const int (*)[ARRAY_LEN]);
 
int main(void) {
	int array[ARRAY_LEN];
 
	init_array(&array);
	print_array(&array);
	return 0;
}
 
void init_array(int (*parray)[ARRAY_LEN]){
	int i;
	for(i=0;i<ARRAY_LEN;i++)
		(*parray)[i] = i;
	return;
}
 
void print_array(const int (*parray)[ARRAY_LEN]){
	int i;
	for(i=0;i<ARRAY_LEN;i++)
		printf("%d\n", (*parray)[i]);
	return;
}

실행 결과: https://ideone.com/KfDRkZ

덧. 생각해 보니까, 오목판은 2차원 배열이겠군요.
제가 아까 배열은 그냥 놔두면 알아서 첫 원소를 가리키는 포인터로 변환된다고 말씀드렸던 것 기억하시나요.
따라서 int array2d[ARRAY_LEN][ARRAY_LEN];일 때 array2dint [ARRAY_LEN][ARRAY_LEN] 타입이었지만 int (*)[ARRAY_LEN]으로 변환됩니다.

2차원 배열을 그대로 넘겨주려면 사실 &array2d와 같이 할 수 있겠지만(그러면 타입이 int (*)[ARRAY_LEN][ARRAY_LEN]이 됩니다), 그렇게까지 하지는 않은 것 같네요.

질문자님의 코드와 비슷할 것 같은 용례를 하나 더 드리지요.

#include <stdio.h>
 
#define ARRAY_LEN 10
 
static void init_array(int (*)[ARRAY_LEN]);
static void print_array(const int (*)[ARRAY_LEN]);
 
int main(void) {
	int array2d[ARRAY_LEN][ARRAY_LEN];
 
	init_array(array2d);
	print_array(array2d);
	return 0;
}
 
void init_array(int (*parray)[ARRAY_LEN]){
	int i, j;
	for(i=0;i<ARRAY_LEN;i++)
		for(j=0;j<ARRAY_LEN;j++)
			parray[i][j] = i * ARRAY_LEN + j;
	return;
}
 
void print_array(const int (*parray)[ARRAY_LEN]){
	int i, j;
	for(i=0;i<ARRAY_LEN;i++){
		for(j=0;j<ARRAY_LEN;j++)
			printf("%3d", parray[i][j]);
		putchar('\n');
	}
	return;
}

실행 결과: https://ideone.com/LHegTd

Jo Kilge@Facebook의 이미지

답변 감사드립니다 속시원하게 해결되었습니다 ^^

shint의 이미지

정확한지 값을 출력하거나. 잘아시는분께 확인해보세요.

How do I declare a 2d array in C++ using new?
http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new/936702

C언어 int (*arr)[]
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=273010140&qb=aW50KCopW10=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0

http://codepad.org/3iJn217D

#include <stdio.h>
#define DIM 3
#define WORMS 2 //gusanos
 
//double CENW[][DIM]
void halla_centros_V000(double (*CENW)[DIM])
{
    printf("%d\n", (int)CENW[0][0]);
    printf("%d\n", (int)CENW[0][1]);
    printf("%d\n", (int)CENW[0][2]);
    printf("%d\n", (int)CENW[1][0]);
    printf("%d\n", (int)CENW[1][1]);
    printf("%d\n", (int)CENW[1][2]);
}
 
int main()
{
    double *CENW_MEM=new double[WORMS*DIM];
    double (*CENW)[DIM];
    CENW=(double (*)[3]) &CENW_MEM[0];
    CENW[0][0] = 0;
    CENW[0][1] = 1;
    CENW[0][2] = 2;
    CENW[1][0] = 3;
    CENW[1][1] = 4;
    CENW[1][2] = 5;
    halla_centros_V000(CENW);
    delete[] CENW_MEM;
    return 0;
}

//In C++ using new:
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char **argv) 
{
    typedef double (array5k_t)[5000];
    array5k_t *array5k = new array5k_t[5000];
 
    array5k[4999][4999] = 10;
    printf("array5k[4999][4999] == %f\n", array5k[4999][4999]);
    return 0;
}
 
//Or C style using calloc:
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char **argv) 
{
    typedef double (*array5k_t)[5000];
    array5k_t array5k = calloc(5000, sizeof(double)*5000);
 
    array5k[4999][4999] = 10;
    printf("array5k[4999][4999] == %f\n", array5k[4999][4999]);
 
    return 0;
}

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

장은총@Facebook의 이미지

감사합니다 참고하도록 하겠습니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.