2013년 3월 2일 토요일

일반 포인터와 다중 포인터(삼중 까지)

이번 포스트는 다중포인터 즉, 이중과 삼중포인터에 대해 다룰껀데요.

포인터가 뭔지 모르거나 헷갈리는분들은 링크를 달고 싶지만 이상하게 포인터에 대한 내용을 안 다뤘네요.

그러므로 포인터부터 시작하겠습니다.

1.포인터

포인터는 변수와 달리 방향을 가지고 있습니다.

포인터는 어떤 변수를 가리키는 함수인데, 가리킨 변수의 주소값에 저장을 목적으로 선언 됩니다.

일단 일반포인터에 대해 맛보자면,

ex)
int t=1;
int *t1=t;  // 포인터는 변수앞에 *을 붙입니다.

*t1+=1;
printf("%d",t);

결과는 2가 나옵니다. 즉, 포인터를 더해도 포인터가 가리키는 변수도 바뀝니다.

그러니까 포인터가 가리키는 주소에 1을 더해라!라는 명령을 하였고, 컴파일러는 ㅇㅇ이라는 해석을 한거죠.

포인터도 연산을 하는데 그건 링크를 달아드릴게요.
포인터 연산!

이상하게 포인터연산은 포스팅했는데 포인터는 안했네요.

아무튼 이중 혹은 더블포인터로 넘어 갈게요.

2.이중포인터

일반포인터는 *하나를 이중포인터는 **로 선언합니다.

이중포인터는 일반포인터를 가리키는건데요.

즉, 그러니까 일반포인터가 어떤변수를 가리키고 그 포인터를 이중포인터가 가리키는거죠.

생각해보면 별거 아닙니다.

선언한 숫자를 바꿔주는 프로그램으로 왜 이중포인터가 필요한지 알아보겠습니다.

우선 실패작
보시면 결과는 실패입니다.

왜일까요?

네, 바로 제가 주석처리한 문장이 답입니다.


*t와 *t1은 *pt와 *pt1과 같은 일반포인터이므로 누가 누굴 가르키기는 커녕 전혀 무관합니다.

그래서 SWAPPING 프로그램의 t,t1끼리만 바꾸고 pt까진 바꿔주지못하고 출력해버린겁니다.

그림으로 설명하자면

SWAPPING 대입할 때 상황
* pt ㅡ>(대입)  *t(참조)→t                          
*pt1 ㅡ>(대입)*t1(참조)→t1

SWAPPING 대입하고 해석 상황
*pt ㅡ> *t  ㅡ>t1
           ↑↓
*pt1ㅡ>*t1 ㅡ>t

이렇게 되는겁니다.


그럼 SWAPPING프로그램에다가 이중으로 바꿔준다면? 방향은 바뀌게 될 건데, 실험으로 알아보겠습니다.


이번엔 성공!

왜 성공한줄은 아시겠나요?


모르시겠다면 그림으로 상황설명을 하겠습니다.

스와핑함수에 대입상황

**t ㅡ> *pt ㅡ> t
**t1ㅡ>*pt1 ㅡ>t1

대입 후 함수 해석상황

**t   ㅡ>*pt↘t
**t1ㅡ>*pt1↗t1

그니깐 스와핑함수의 이중포인트 두개는 메인함수의 일반포인터를 계속 가리키고있고 이중포인터가 가리키는 것을 서로 바꿧으므로 이중포인터가 가르키는것도 바뀌기 때문입니다.

처음 실험 때와 차이를 묻는다면, 스와핑함수안에 포인터함수들의 가리키는 방향에 차이입니다.

그러니까 처음실험때는 스와핑안에 포인터들은 자기들끼리 바꾸고 메인함수의 포인터들까지는 바꾸지 못 한것이고, 두 번째 실험엔 이중포인터가 일반포인터를 가리키므로 일반포인터채로 바꿔버린겁니다.

이중포인터는 서로 다른 함수끼리의 변수주소이동에 정말 유용하게 쓰입니다.

그럼 삼중포인터로 넘어가겠습니다.

3.삼중포인터

긴말 안하고 방향이 삼중ㅡ>이중ㅡ>일반포인터 의 순서대로라고만 설명하고 포스트를 마치겠습니다.

참고로 삼중포인터는 *** t로 선언합니다.

다차원 배열에 대해서(3차까지.)

안녕하세요.
새내기 tender입니다. 정말 오랜만에 글 써보는데요.

그래서 쉬운 포스트부터 시작할 것이구요.

그리하여 이번 포스트에선 2차 3차 배열에대해 다룰껍니다.

별로 다른건 없구요. 수학으로 빗대자면 1차배열(여태사용한 배열 물론 이 블로그에서)은 직선, 2차배열은 가로세로의 길이가있는 평면도형, 3차배열은 가로세로높이의 길이가 있는 공간도형이라고 표현할 수가 있습니다.

혹시나 배열에 대해 모르시는 분들을 위해 링크를 걸어두겠습니다.
C언어에서 배열을 해보자!
배열은 포인터다!

지금도 C언어에대해 그렇게 잘 아는것은 아니지만 초기때보다 지식이 넓어졌으므로 지금 저 포스트들을 보면 저 포스트들의 설명이 어색하고 횡설수설한 말만 할지라도 탈 없이 봐주시면 감사하겠습니다.

우선 2차배열부터 시작하겠습니다.

2차배열

수1을 떼우셨다면 다 아는 행렬 아시죠?

      1열  2열
1행   2     3

2행   1     4

 2차배열은, 말 그대로 행렬입니다.

그럼 선언과 초기화방법이랑 출력방법을 실험으로 알려드리겠습니다.

1.무작정 다 써서 초기화하는 방법.
13: 2중 반복문을 통해 행과 열을 다 출력함.
이걸로 무작정 다 써서 초기화하는 방법 끝.

2.scan함수로 입력해서 초기화하는 방법.

여태까지 다 한 것들입니다.
아 이런방법도 할 수 있었지 이렇게 생각해주시고 넘어가도 상관없습니다.


3. 배열의 크기를 선언하지 않고 초기화 하는 방법.

이 부분은 조심해야할 것이 하나 있습니다.
그것은 일단 1차원 배열에서 무작정 선언 어떻게했었는지 먼저 더듬고 시작하겠습니다.

t[]={~,~,~,~,~,~,~};
~의 개수가 길이였죠?

그런데 이번 2차원 배열에서는 길이가 한 직선뿐만있는 1차원 배열과는 달리 가로 세로 이렇게 두 개의 길이가 존재하기 때문에, 둘 다 비우면 안 되고 열은 꼭 써줘야 컴파일러가 그걸 자동으로 해석을 해줍니다.

실험으로 알아보겠습니다.

첫 째, 우선 둘 다 비웠을 경우

실패

둘 째, 열을 썼을 경우

성공!

이렇게 2차배열을 마치고 3차배열로 넘어가겠습니다.

3차 배열

3차배열은 공간도형이라 생각하시면 되는데, 저 같은 경우는 출력할 때, 공간도형 생각했다가 되게 고생했구요(상상이 좀 풍부해가지고 ㅋㅋ;)

원리만 공간도형이라고 편하게 생각하시고, 예로는 아파트 생각하시면 됩니다.

동과 호 그리고 층이있는 아파트를 생각하시면 되고 이것마저 생각하기 힘들다면 생각하지마시고 배열하나에 배열 2개가 들어가있다고 생각하시면 됩니다.

그래도 이해가 안 된다면, 그냥 입력할 수 있는 갯수가 더 늘어난다 생각하시고 도형같은 거 그냥 잊어버리세요.

뭐 두서가 좀 길어졌는데요.

본론으로 들어가서 선언과 초기화 방법을 알려드릴게요.

초기화방법은 위에서 다 했듯이 2차 배열은 2중 반복문이라면 3차배열은 3중 반복하면 되겠습니다.

실험으로 선언과 초기화방법을 알려드릴게요.


이걸로 3차배열을 마치고 마지막으로 2차배열과 3차배열의 크기 계산을 알아 보겠습니다.


크기 계산 방법.

1차배열에선 어떻게 구했었죠?

바로 자료형크기x길이이었었죠?

그럼 2차배열과 3차배열은 어떻게 구할까요?

1차배열에선 길이지만 2차배열과 3차배열은 넓이가 있습니다.

자료형의크기x넓이입니다.

그럼 실험으로 알려드리고 포스트를 마치겠습니다.