C++프로그래밍

2013.05.15_배열포인트_cast,함수포인터.

성엽이 2013. 5. 15. 23:36

[C] 배열 포인터 cast.

2차원 배열를 1차원으로 접근, 1차원 배열을 2차원으로 접근.

1차원, 2차원 배열은 컴퓨터 메모리에 저장은 일차원으로 저장이 된다.(일차원과 같은 연속적이 메모리에 저장)

[Source Code 0]
:
int multi0[3][4] = { {1,2,3,4} , {5,6,7,8} , {9,10,11,12} };
int multi1[10] = {1,2,3,4,5,6,7,8,9,10};


int *Arr0, (*Arr1)[5];


Arr0 = (int *) multi0;
Arr1 = (int (*)[5]) multi1;


printf("[Array] %d : %d : %d\n", Arr0[6], *(Arr0+6), multi0[1][2]);
printf("[Array] %d : %d : %d\n", Arr1[1][1], *(*(Arr1+1)+1), multi1[6]);

:

[Result]
[Array] 7 : 7 : 7
[Array] 7 : 7 : 7
계속하려면 아무 키나 누르십시오 . . .

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
multi0은 2차원 배열 선언이 되어있다.
Arr0 = (int *)multi0;
일차원으로 캐스트해서 사용. Arr0[0] 이와 같이 접근가능하다. multi0[0][0] 이렇게 접근할 수 있음.


multi1은 1차원 배열 선언이 되어있다.
int (*Arr1)[5];
Arr1 = (int (*)[5])multi1;
위와 같이 포인터 선언후. (int (*)[5]) 캐스트하여 사용, Arr1[0][0] 이와 같이 접근이 가능하다.

포인터 선언 후 배열을 캐스트하여 접근할 수 있는 방법이다. 위의 예제를 참고...


아래와 같은 코드도 사용할 수는 있겠지만. 특별한 처리가 아니라면 위의[Source Code 0] 사용하세요.
[Source Code 1]
:
int code0[10];
int code1[2][5] = {1,2,3,4,5,6,7,8,9,10};


for(int i=0; i<2; i++)
{
for(int j=0; j<5; j++)
{
code0[i*5+j] = code1[i][j];
}
}


for(int i=0; i<10; i++) printf("%d ", code0[i]);
:
[Result]
1 2 3 4 5 6 7 8 9 10 계속하려면 아무 키나 누르십시오 . . .

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
for 루프 부분을 memcpy() 함수로 하나로 할 수 있지만....
이러한 메모리 복사가 필요없다면 [Source Code 0] 위의 코드를 사용할 수 있습니다.

-----------------------------------------------------------------------------------------------------------------------------------------------

 

[C언어] 함수이름도 포인터

혹시 함수도 주소값을 갖고 있다는거 아시나요?
그럼 함수의 자료형만 안다면 함수역시 포인터가 되는거 아닐까요?
그렇습니다 함수역시 주소값을 갖고 있고 자료형또한 갖고 있습니다.
그럼 주소는 어떻게 되고 자료형은 무엇을 갖는지 그 자료형을 어떻게 알아 내는지 를 알아보죠
간단히 함수의 포인터 타입을 알아보자는겁니다.

void show(int a){
printf("%d \n",a);
}
위와같은 함수가 있습니다 간단히 int형 변수를 매개변수로 받아 출력을 하는 show합수지요
함수의 자료형을 얻기 위해서 우린 함수의 리턴타입과 매개변수타입이 무엇인지를 알아야 합니다.
위의 show 함수의 리턴타입은 void형 이고 매개변수는 int형이되겠지요..
그럼 show의 포인터 를 만들이렇게 됩니다.
void(*show_ptr)(int) = show;
위의 문장을 보면 잘 이해가 안가실겁니다. 위의 포인터타입을 영어해석(?) 하듯 읽어 보지요.
show 함수의 포인터 show_ptr을 선언하는데 리턴타입은void형이고 매개변수는 int형인 포인터 *show_ptr을 선언.

음... 어렵나요? 그럼 이렇게 비교해보죠
void show(int a) --> show함수
void(*show_ptr)(int) --> 포인터 show_ptr
어떻습니까 둘이 많이 닮아있죠? 다 똑같은데 함수에 괄호()와 이름앞에 '*'붙은거 뺴곤 똑같다는것을 알수있습니다.

다른 예를 한번더 들어보죠.
int fct(char *str, int aa)
void(*show_ftc2)(char*, int)
이제 좀 감이 오시죠? 이렇듯 함수를 포인터로 선언한것을 우리는 함수포인터라 합니다.
하지만 둘이 완전히 같은것은 아닙니다 ..

[ 함수와 함수포인터의 차이 ]
함수 --> 포인터 상수
함수 포인터 --> 포인터 변수

[ 함수포인터 간단한 예제]
#include <stdio.h>

void show(int a){
printf("%d \n",a);
}

int main(void){
int aa = 10;
void(*show_ptr)(int) = show;

printf("%d %d \n",show,show_ptr);

show(aa);
show_ptr(aa);

return 0;
}

함수의 정체를 알았기 때문에 우린 이제 show() 함수를 이렇게 이렇게 읽어야 될겁니다. show라는 포인터가 가르키를 함수를 호출하면서 인자값으로 상수 10을 전달하라고 말이죠.

 

라고함.