오늘은 포인터 심화과정의 마지막 시간입니다. 오늘 내용까지 다 배우고 나면 C언어의 큰 관문 중 하나인 포인터를 완벽하게 넘게됩니다. 끝까지 파이팅 하시기 바랍니다. 이해가 잘 안되는 부분은 반복적으로 읽어보고 여러번 연습을 하다보면 자연스럽게 이해가 될겁니다. 반복이 중요합니다!!
1. 배열포인터
먼저 배열포인터에 대해서 알아보려고 합니다. 배열포인터는 말그대로 배열의 형태를 가진 포인터 입니다. 사실 앞에서 배웠던 내용이 전부 배열포인터에 대한 내용들입니다.(완벽한 배열포인터는 아니지만요!!) 그럼 간단하게 정리를 해볼까요?
이렇게 포인터에 배열의 첫번째 원소의 주소값을 집어넣어도 되고, 배열의 이름을 집어넣어도 포인터에는 동일한 주소값 데이터가 들어가게 됩니다. 먼저 실행하여 결과값을 알아보도록 하겠습니다.
역시 동일한 주소값이 들어가 있는 것을 알 수 있습니다. 이렇게 배열과 포인터를 연동시켜 놓는다면 아래와 같이 지속적으로 포인터에서 배열의 각 원소의 데이터 값에 접근할 수 있게 됩니다. 이렇게 1차원 배열은 단순히 배열과 포인터를 연동시키는 것만으로 충분히 사용이 가능했습니다. 하지만 이건 일반적인 포인터일뿐 배열포인터까지는 아니죠.
그렇다면 2차원 이상의 배열은 어떻게 포인터와 연동시킬 수 있을까요? 그것 때문에 바로 배열포인터라는 포인터형식이 존재합니다. 1차원 배열에서는 위와 같은 방법만으로도 충분히 포인터를 이용해 배열의 주소나 배열의 데이터에 접근이 가능합니다. 그렇지만 2차원이상의 배열에서는 써먹을 수 없는 방법이죠. 그럼 2차원 이상의 배열에서 사용하기 위한 배열포인터의 형식은 어떻게 될까요?
바로 실행해서 결과값을 알아보도록 하겠습니다. ( 세번째 원소라고 잘못 작성하였습니다. 배열에서 보면 [0][1]은 전체 순서로 따지면 세번째가 아니라 두번째입니다. 배열의 내용을 확실히 기억하신다면 2차원 배열도 순서대로 존재한다는 걸 기억하시리라 믿습니다!!! )
정상적으로 뜨네요. 하나 더 볼까요?
실행해서 결과값이 어떻게 뜨는지 한번 보겠습니다.
이렇게 연동하여 사용할 수 있음을 알 수 있었습니다. 여튼 우리가 배열포인터를 사용하는 궁극적인 목표는 배열을 포인터와 연동하여 포인터를 이용해서 배열의 데이터값에 접근할 수 있도록 하는 것이 주 목적임을 잊지 말아야 합니다. 위 예제들에서 알아보았던것과 같이 배열포인터의 형식은 int (*pa)[x]형식을 띈다는것을 기억하십시오. 꼭 소괄호를 사용하고, 배열의 마지막 차원의 크기를 꼭 입력해야 합니다.
2. 포인터배열
다음으로 알아볼 내용은 포인터배열입니다. 응? 포인터배열은 뭐냐구요? 포인터와 같이 주소값을 데이터 형식으로 가지는 배열을 의미합니다. 배열포인터는 여러 타입의 데이터를 가진 배열에 연동시키는 포인터이고, 포인터배열은 포인터와 같이 주소값을 데이터형식으로 가지는 배열인것입니다. 배열포인터는 포인터, 포인터배열은 배열!! 좀 더 머리속에서 정리가 되시나요? 예제를 통해서 좀 더 확실히 알아보도록 하겠습니다.
위 예제프로그램은 포인터배열을 만들어서 정수형 변수 3개(a, b, c)를 연동시킨 다음 포인터배열이 가리키는 주소에 들어 있는 데이터를 출력해보는 프로그램입니다. 예제프로그램 하단부에 있는 for문은 이미 다들 잘 아시리라 생각해서 제외하고 핵심적인 부분을 설명해보자면 아래의 포인터배열 형식부터 잘 봐야 합니다.
위 형식이 바로 포인터배열의 형식으로 배열의 형태와 포인터의 형태를 동시에 취하고 있습니다. 그리고 정수형 변수를 3개 선언한 다음 포인터 배열과 연동시킨 부분도 중요합니다.
우리가 이전에 포인터를 처음 배울때 포인터의 이름을 변수의 주소와 연동시켰듯이, 포인터배열의 이름 역할을 하는 원소의 이름전체를 사용하여 변수의 주소와 연동시켜야 합니다. 일단 한번 실행시켜서 결과를 보겠습니다.
오 정상적으로 실행되는것을 확인할 수 있습니다. 그럼 여기서 한가지 의문이 생깁니다. 여러개의 변수를 따로 선언하기 귀찮은데 배열로 선언하여 연동시킬 순 없을까? 의문이 생기면 직접해봐야 합니다. 그래야 확실히 기억할 수 있어요. 한번 해보도록 하겠습니다.
자 정수형 데이터를 가지는 배열을 만들고 포인터배열과 연동시켜 보았습니다. 바로 실행해서 결과값을 한번 보겠습니다.
아~ 이건모죠? 포인터배열의 첫번째 원소인 ap[0]만 출력되었습니다. for문이 정상작동 안하는 것인가 싶어서 강제로 포인터배열의 각 원소를 출력해 보기도 하고 정수형 데이터를 가진 array배열을 포인터배열과 연동시킬때 이름만 사용하지 않고 아래와 같이 배열 첫번째 원소의 주소값을 직접 사용해 보기도 하였지만 우리가 원하는 결과값은 나오지 않았습니다.
그럼 배열을 만들어서 포인터배열과 연동시키는 것은 아무런 의미가 없어지네요. 자 이렇게 해서 포인터에 대한 내용을 모두 알아보았습니다. 굉장히 복잡하고 어렵게 느껴졌지만 하나씩 하나씩 차근차근 알아가다보니 포인터를 정복할 수 있었네요. 만약에 전체적인 개념이 아직 완벽하지 않다고 느끼신다면 한두번 더 반복해서 읽어보시는 것을 추천드립니다.
오늘은 여기까지 하겠습니다. 감사합니다.
제 블로그를 방문해 주셔서 감사합니다.
도움이 되셨다면 공감(좋아요) 부탁드리고,
댓글은 다른분들께도 좋은 정보일 수 있으니
공개로 부탁드립니다.
여러분의 작은 정성이 좋은 포스팅을 생산하는
힘이 된답니다. :)
감사합니다.
'PROGRAMMING > C' 카테고리의 다른 글
C언어 Function 심화 (사용자 정의 함수) (0) | 2022.11.14 |
---|---|
C언어 Function 기초 (사용자 정의 함수) (0) | 2022.11.09 |
C언어 포인터 심화과정 (배열과 포인터, 포인터의 포인터) (0) | 2022.11.02 |
C언어 포인터 심화과정 (포인터 연산) (3) | 2022.11.01 |
C언어 포인터 심화과정 (상수포인터) (0) | 2022.10.31 |
댓글