본문 바로가기
OLD/[C]정리중

[개탱][C][변수 읽는법][Pointer][Double Pointer][함수 포인터][더블 포인터][포인터]

by 개탱 2018. 1. 2.
728x90

포인터..


어려운거 하나도 없다! 


Pointer 란? 

 말 그대로 무엇인가를 가킨다.


Pointer를 정의 해줄 때 C언어에서는


Type 과 변수명을 선언하는 그 사이에 '*'를 적어줌으로서


ex) 

int* a;

a는 가킨다. 무엇을? int형 타입의 변수를 가리킨다.

즉 자신보다 *개수가 하나 적은 타입을 가리킨다고 생각하자.


다시말해

int* a 는 int* 보다 *개수가 하나 적은 int형을 가리키게 되는것이다.




뭐 더블포인터.. 이런게 많은데 다 똑같다


int** a;

a는 가킨다. 무엇을? 자신의 타입인

int** 형보다 *가 한개가 적은

즉 int*형을 가리키게 되는것이다.


자 그럼 하나더해서


char*** c;

c는 가리킨단다. 무엇을? 자신의 타입인

char***형보다 *가 한개 적은

char**형을 가리키게 되는것이다.


평소 변수를 생성할 때 

Type 변수명; 

위와 같이 정의를 해주는데 이때 읽는 법으로는


변수명의 오른쪽을 먼저 확인한다.(함수포인터 같은 경우 때문 [함수 포인터는 아래에서 설명])

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

int** a; 

a의 오른쪽에 무엇이 있는가?

a;

';' 세미콜론이 있다. 즉 a의 오른쪽에는 아무것도 없는 것이므로 그냥 변수다. 어떤변수?

이제 왼쪽을 확인한다.

int** a

'*' 포인터가 있다. 

이것을 만나면서 이제 a는 무엇인가를 가키는 포인터가 된거다.

하지만 포인터는 무엇인가를 가키는 것이므로 무엇?

그 바로 왼쪽들을 확인한다

int** a 


'int*' 즉 a는 (int*)라는 타입을 가진것을 가키는 포인터다

정말 하나도 어려운게 없다.. ㅠ

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


이번엔 위에서 말한 함수포인터도 보여주겠다.




아까 말한것과 같이 오른쪾을 확인한다.

 int (*a)(int , int );

')' 를 만나면서 아까 ';'를 만난 것처럼 왼쪽으로 간다.

 int (*a)(int , int );

'*' 가킨다. 무엇을?

괄호를 빠져나간뒤 다시 오른쪽을 확인한다.

int (*a)(int , int );

그렇다 a는 매개변수를 (int , int ) 로 갖는 함수를 가킨다. 그뒤 ';'를 만나면서 왼쪽을 확인


 int (*a)(int , int );

int를 만나면서 a는 (int, int)를 매개변수로 갖고있으며 int형을 반환하는 함수를 가키는 포인터다.

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



이번엔 배열로 확인을 해보겠다. 조금 햇갈리는 사람들이 많더라.. 저도 설명하면서 틀렸다면

댓글로 부탁드립니다 ㅠ


int (*a)[5]; 라는게 있고

int (*a[5]); 라는게 있다


이번엔 상세히 적기엔 너무 길어지므로 간단하게 적어보겠다.


먼저

int (*a)[5];

a의 오른쪽 ')' 바로 왼쪽 확인.

'*' 그렇다 a는 가킨단다.

무엇을?

() 탈출 

오른쪽 확인 '[5]'

a는 5칸짜리 배열을 가킨단다.

그 배열의 타입은?

왼쪽확인

'int'

그렇다 a는 int형들을 5칸으로 나열해둔 배열을 가키는 포인터다.


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

int (*a[5]); = int* a[5];


a의 오른쪽 '[5]' 확인.

a는 [5]칸의 배열이다. 어떤 타입들로 채워진?

그 뒤 다시 오른쪽 확인 ')' 

그러고 왼쪽 확인 '*'

a라는 5칸짜리 배열은 포인터로 채워져 있다.

그런데 포인터는 무엇인가를 가킨다. 무엇을?

() 탈출후 오른쪽 확인 

 세미콜론이 있다. 그러면 다시 왼쪽을 확인하자.

'int'

그렇다 a는 int을 가키는 포인터들로 채워진 5칸짜리 배열이다.


오른쪽 int* a[5] 역시

우측 [5] 좌측 '*' 좌측 int 


거의 대부분의 변수들을 읽을때 우측으로 ')' 또는 ';' 를 만날 때 까지 읽은 후

끝 또는 '('를 만날때 까지 좌측으로 읽으면 모든게 쉽게 읽어진다

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


나중에 POINTER 관련해서는 한번더 글을 올려보겠습니다!

댓글