1. 포인터란??
포인터는 자료형 중 하나로써, 주소를 나타내는 특수 자료형으로 일반적으로 변수의 주소를 저장한다. 보통 표현할 때는 "변수를 가리킨다."라고 한다. 주소는 기본적으로 정수로 표현되지만 정수 자료형인 'int'와 구별한다. 그래서 선언 시 포인터임을 명시해야 한다.
2. 포인터의 선언 방법
포인터를 선언할 때는 기존의 자료형과는 다르게 * (참조 연산자)를 덧붙여 표현한다. 어떤 자료형의 포인터인가의 따라, 정수형 포인터, 실수형 포인터, 문자형 포인터 등의 포인터 변수로 구분된다.
int *pnum1; //정수형 포인터
float *pnum2; //실수형 포인터
char *pch; //자료형 포인터
모두 주소를 나타내는 변수이지만 대상의 자료형이 다르기 때문에 다른 자료형으로 취급한다.
char *pch;
char* pch;
int *pnum;
int* pnum;
참조 연산자는 자료형 쪽에 붙여 사용하기도 하지만 일반적으로 변수에 붙여 많이 사용한다.
int num, *pnum = #
int *pnum = &num, num; // 컴파일 오류
포인터 변수와 일반 변수를 동시에 선언할 수도 있고 동시에 초기화할 수도 있다. 하지만 여기서 선언 순서가 중요하다. 위의 예제는 일반 변수와 포인터 변수를 동시에 선언하고 포인터 변수를 일반 변수로 초기화한 것이다. 그러나 여기서 포인터 변수를 초기화하려면 일반 변수의 주소 값이 필요하기 때문에 일반 변수를 먼저 선언해줘야 한다.
3. 포인터의 사용
포인터 변수는 일반 변수의 주소를 저장하여 사용하는데 이것을 " 포인터와 변수를 연결한다."라고 한다.
char ch = 'A',*pch;
int num = 3, *pnum;
pch = &ch; // & (주소연산자), 변수 ch의 주소를 포인터 변수인 pch 에 저장 (연결)
pnum = # // 변수 num의 주소를 포인터 변수 pnum 에 저장 (연결)
printf("%c %p\n", ch, pch); // %p: 주소 출력할 때 사용한다
printf("%d %p\n", num, pnum);
*pch = 'B';
*pnum += 5;
printf("%c\n", ch);
printf("%d", num);
실행결과는
A 001EA03C
3 001EA042
B
8
위의 예제는 참조 연산자를 이용하여 대입한 예제이다. ch='B'와 *pch='B'는 같은 기능을 하지만 전자는 직접 접근, 후자는 간접 접근이라고 한다. 참조 연산을 할 때 연산자 간에 우선순위에 따라 값이 변할 수 있으므로 주의해야 한다.
※ 포인터 변수를 사용할 때, 주의할 점 ※
1. 포인터 (변수)를 사용할 때에는 항상 선언 후 반드시 초기화를 해줘야 한다. 포인터 (변수)를 초기화하는 방법에는 두 가지가 있는데 포인터 (변수)를 다른 변수와 연결하는 방법과 널(NULL) 포인터와 연결하는 방법이 있다. 널 포인터란 아무것도 가리키지 않는다는 뜻으로 " p=NULL; "로 사용한다. 일반 변수를 0으로 초기화하는 것이랑 같은 맥락이다.
2. 주소 연산자(&)는 포인터를 포함한 모든 변수에 사용 가능하지만 참조 연산자(*)는 포인터 (변수)에만 사용 가능하다.
3. 포인터 자료형과 연결된 변수의 자료형이 일치해야 한다. 불일치하면 프로그램 오류의 원인이 될 수도 있다.
4. 포인터의 크기
포인터의 크기를 보면 포인터의 자료형에 관계없이 주소를 저장하기 위해 필요한 공간은 같기 때문에 보통 주소의 크기와 동일하다.
char *pch;
int *num1;
double *num2;
printf("%d\n", sizeof(pch));
printf("%d\n", sizeof(num1));
printf("%d\n", sizeof(num2));
실행 결과
4
4
4
변수 크기를 알아보는 sizeof 연산자를 사용해서 크기를 출력한 결과 자료형에 관계없이 포인터의 크기는 4 bytes로 같은 것을 확인할 수 있다.
'프로그래밍 > C 언어' 카테고리의 다른 글
문자와 문자열 ( 2. 문자열의 배열 및 처리 함수) (0) | 2020.03.13 |
---|---|
문자와 문자열 ( 1. 문자열이란? ) (0) | 2020.03.09 |
포인터 ( 4. 함수와 포인터 ) (0) | 2020.03.02 |
포인터 ( 3. 포인터 연산 ) (0) | 2020.02.28 |
포인터 ( 2. 배열과 포인터 ) (0) | 2020.02.18 |