CAPS 위키 : 포인터

포인터 [ 수정 내역 ] [ 수정 ]

최근 수정:

목차

1. 정의

2. 세부

3. 사용

3.1. 기본 예시

3.2. 쓰임새

4. 고난이도

5. 배열과 포인터

5.1. 배열 포인터? 포인터 배열?

5.2. 함수 포인터? 포인터 함수?

6. 기타

7. 같이 보기

1. 정의

주소를 담는 변수.

2. 세부

흔히 변수를 가리키는 표지판 정도로 설명하던데, 오개념이 심어질수 있는 설명이니 주의하기 바람.

int 형 포인터라 함은 int형 자료의 주소값을 저장하는 변수.

double형 포인터라 함은 double형 자료의 주소값을 저장하는 변수를 뜻한다.

흔히 배열과 포인터가 비슷하게 취급되어 둘 사이의 차이점과 공통점은 경험있는 프로그래머들도 가끔 헷갈려 한다.

그 정도로 비슷하니 우리같은 머리 널널한 코더들은 동일하게 취급하자.

3. 사용

자료형 * 변수이름

3.1. 기본 예시

#define _CRT_SECURE_NO_WARNINGS

#include

int main()

{

int a = 3;

int b; /* b와 pa는 a를 저장할 변수 하나는 포인터, 다릉 하나는 변수.(비교)*/

int *pa; /* int * pa; int* pa; *의 위치에 상관 없음. */

pa = &a; /* &는 주소 연산자. -> a의 주소를 저장하는 포인터 변수.*/

b = a; /* a를 복사.*/

b = 4; /* b = 3에서 4로 변해도 a는 여전히 3. */

*pa = 4; /* *pa = a = 4; *pa = 4이면 a도 같이 변함.*/

}

3.2. 쓰임새

일단 포인터의 사용은 위와 같이 주소값을 타고 들어가 *를 이용해서 본체를 수정함에 있다.

그래서 결국 어디에 쓰이냐? 한다면, 함수에서 받은 매개변수를 수정할 필요성이 있을때 쓰인다.

함수에 매개변수를 일반적인 변수 그대로 준다면 - 이를 값에 의한 호출이라고 하는데 - 함수 내부에서 값을 복사하고 이용하는데,

이 복사한다는 특성 때문에 매개변수의 값은 함수에 들어가기 전후가 바뀔 수 없다.

좋게 생각하면 매개변수의 값이 보존되어 헷갈릴 여지가 없으나, 달리 말하자면 매개변수 자체를 변경하고 싶을 수 없다는 것이다.

이럴 때 함수의 매개변수 형을 포인터로 쓰고 호출 할 때 매개변수의 주소값을 준다면 - 주소에 의한 호출- 함수 내부에서 값을 변경할 수 있게 된다.

4. 고난이도

C언어를 처음 배우는 학생들이 C언어를 던지고 신소재공학과, 전기전자공학과로 도망가게 하는 C의 수문장.

포인터는 단순히 "변수를 쓰는것"이 아닌 "변수의 주소값"을 타고 들어가 제어하는 저수준의 프로그래밍을 가능하게 하는 물건이다.

그만큼 강력하나, 그만큼 어렵고 헷갈리니, 큰 프로그램을 만드는 것에 도전해서 익숙해 지도록 하자.

그렇기 때문에 포인터를 어렴풋이 "변수를 가리키는 놈"정도로만 이해한다면 앞으로의 코딩에 큰 문제가 있을 수 있으니 정의를 유념히 보도록 하자.

5. 배열과 포인터

배열과 포인터 항목 참조.

포인터가 매우 헷갈릴 수 있는 개념은 맞지만, 개념 자체가 헷갈리는 물건이 아니다 보니

포인터 단원에서 헷갈릴 만한 요소는 별로 없는 가운데, 아래에서 헷갈릴 수 잇는 개념 2개가 있다.

함수 포인터, 포인터 함수의 차이점 / 배열 포인터, 포인터 배열의 차이점이다.

2학년, 3학년때에도 자주 헷갈리는 개념이지만 아래와 같이 생각하여 헷갈림을 좀 줄여보도록 하자.

5.1. 배열 포인터? 포인터 배열?

배열 포인터. 포인터 배열.

위 두 단어는 일종의 말장난이라서 헷갈리는 것도 있지만, 배열과 포인터가 본질적으로는 비슷하다는 점이 혼란을 가중시킬 수 있으니 주의하자.

쉽게 생각해보자.

"int" 포인터: "int 형" 자료의 주소를 저장하는 변수.

"char" 포인터: "char 형" 자료의 주소를 저장하는 변수.

"double" 포인터: "double 형" 자료의 주소를 저장하는 변수.

앞의 단어가 int/ char/ double로 달라짐에 따라 ~형 자료의 부분이 변하는것이 보이는가?

똑같이 앞 부분에 "배열"로 바꿔 버리면 뒷 부분도 "배열"로 바뀐다.

즉, "배열" 포인터: "배열"형 자료의 주소를 저장하는 변수. = 배열의 주소를 저장하는 변수.

"int" 배열: "int 형" 변수를 연속적으로 저장하는 데이터구조

"char" 배열: "char 형" 변수를 연속적으로 저장하는 데이터구조

"double" 배열: "double형" 변수를 연속적으로 저장하는 데이터구조

똑같은 논리로 "포인터"배열을 생각해보면 포인터 변수를 연속적으로 저장하는 데이터구조라고 생각할 수 있다.

예시 추가 바람.

5.2. 함수 포인터? 포인터 함수?

위와 같이 생각할 것.

상세 내용 추가 바람.

6. 기타

포인터는 저수준의 하드웨어 제어를 지원하는 C계열 언어에 존재하며

모든 컴파일러가 포인터를 지원하는것은 아니다.

대표적으로 자바는 포인터 개념을 지원하지 않는다.

7. 같이 보기

C언어 프로젝트

배열

함수

변수