-
5. 포인터Programming Language/C 2020. 1. 31. 17:10
포인터(poitner)는 C언어의 가장 대표적인 특징 중 하나로, 일반 변수의 메모리 주소를 값으로 가지는 변수이다. 포인터를 사용하면 변수명을 통하지 않고도 사용하고자 하는 대상에 직접 접근할 수 있어 프로그램이 간결하고 효율적으로 제어된다. 포인터 변수는 (자료형) * (변수명); 과 같이 선언된다. *은 (변수명)이 포인터 변수임을 표시하고, (자료형)은 포인터 변수인 (변수명)에 저장될 주소에 저장될 데이터의 유형을 지정한다. 예를 들어 int * ptr; 이라는 문장은 정수형(int)의 자료를 담을 주소를 저장할 포인터 변수 ptr을 선언하는 문장이다.
#include <stdio.h> int main(void) { int a = 10; int *p = &a; printf("a의 주소 : %p \n", p); printf("p의 주소 : %p \n", &p); printf("p가 가리키는 a에 저장된 값 : %d \n", *p); return 0; }
포인터 자료형으로 사용되는 연산자에는 주소 연산자와 간접 연산자가 있다. 주소 연산자 &는 일반 변수명에 사용하며, 해당 변수의 메모리 주소를 추출하는 연산자이다. 1주차와 2주차에 걸쳐서 살펴본 scanf(“%d”, &num); 에서 &가 이 주소 연산자이다. 즉, scanf() 함수는 앞에서 선언해놓은 변수의 주소에 입력받은 값을 저장하는 것이다. 간접 연산자 *는 포인터 변수명에 사용하며, 주소가 저장되어있는 메모리 위치를 가리킨다. 정리하자면 만약 int * p = &a; 라고 선언되었을 때, p는 a의 주소값, &p는 포인터 변수 p의 주소값, *p는 a에 저장되있는 값을 의미한다.
#include <stdio.h> int main(void) { int i, a[10] = {1, 5, 3, 6, 4, 7, 2, 9, 8, 0}; for(i=0; i<10; i++){ printf("a[i] : %d\n", a[i]); printf("*(a+i) : %d \n\n", *(a+i)); } return 0; }
포인터와 배열은 매우 긴밀히 연관되어있다. 앞에서 예시로 든 int a[10]; 라는 선언을 다시 보자. 배열의 이름은 배열의 시작 주소를 저장하는 포인터 상수이다. 즉 *a와 a[0]은 동일한 의미이고, *(a+i) 는 a[i]와 동일하다. 배열명은 그 자체로서 포인터이지만, 그 값이 변할 수 없다는 점에서 포인터 변수와 다르다. 포인터 변수 p에 대해 p++은 원래 p가 가리키던 곳의 다음 주소, *p++은 그 주소에 들어있는 값을 의미하는 반면, 배열명 a는 a++와 같이 증감 연산자를 사용할 수 없다.
'Programming Language > C' 카테고리의 다른 글
4. 배열과 문자열 (0) 2020.01.31 3. if-else, for, while (0) 2020.01.31 2. 버퍼와 getchar() (0) 2020.01.31 1. 자료형과 표준 입출력 함수 (0) 2020.01.31 0. Hello C! (0) 2020.01.31