[C언어] 포인터

Programming/C Language

[C언어] 포인터

tnddj1219 2020. 3. 29. 12:00
728x90

포인터란?

포인터(pointer)는 가리킨다는 동사 point에 er이 붙은 것이다. 따라서 가리키는 것이란 뜻이다.

포인터는 데이터의 메모리에 저장된 변수의 주소를 가리키는 변수이다. 포인터는 변수이지만 저장하고 있는 것은 데이터의 주소이다.

포인터 p가 변수 i를 가리킨다면, p가 가지고 있는 값은 변수 i의 주소이다.

포인터 선언

포인터를 선언하려면 포인터가 가리키게 되는 대상과 같은 자료형을 먼저 쓰고, *을 붙인 다음, 포인터의 이름을 쓴다. *은 곱하기가 아니라, 간접 참조 연산자로, 포인터를 이용하여 메모리를 간접 참조한다.

포인터와 변수의 연결

포인터가 생성된 직후에는 아직 초기화되어 있지 않다. 따라서 포인터는 사용하기 직전에 반드시 초기화하여야 한다. 포인터에는 변수의 주소가 저장되어야 하므로 &연산자를 이용하여 변수의 주소를 계산하여 포인터에 대입해야 한다.

#include<stdio.h>
int main(void)
{
	int i = 12;//정수형 변수 i 선언
	int *p = &i;//변수 i의 주소가 포인터 p로 대입
}

포인터 사용 시 주의점

  1. 포인터를 초기화하고 사용하여야 한다.

  2. 포인터가 아무것도 가리키고 있지 않을 때, NULL로 설정하는 것이 바람직하다. 

  3. 포인터의 타입과 변수의 타입은 일치하여야 한다.

포인터 연산

포인터를 ++하거나, --할 때 자료형 크기만큼 증가하고 감소된다.

포인터와 배열의 관계

배열은 변수와 다르게 이름이 포인터이다. 즉, 배열 이름은 배열이 시작되는 주소와 같다.
[ex] a란 배열이 있다면, a와 &a[0]의 값은 같다.

*a를 출력하여 보면 첫 번째 원소 a[0]의 값이 출력됨을 알 수 있었다.

따라서  a+i는 &a[i]와 같다. *(a+i)는 a[i]와 동일하다.

#include<stdio.h>
int main(void)
{
	int a[4] = { 10, 20, 30, 40 };
	int *p = a;

	for (int i = 0; i < 4; i++)
	{
		printf("\n***p를 %d만큼 증가***\n", i);
		printf("p=%d\n", p);
		printf("&a[%d]=%d\n",i, &a[i]);
		printf("*p=%d\n", *p);
		printf("a[%d]=%d\n",i, a[i]);
		p++;
	}
}

이렇게 하나씩 해보면 쉽게 이해할 수 있다.

이중포인터

이중포인터는 포인터가 또 다른 포인터를 가르키는 것을 말한다.
char **mp; char *p; char ch;
p=&ch; mp=&p;라고 하면...

포인터 배열

포인터 배열은 포인터들을 모아서 배열로 만든 것이다. 즉 배열의 원소가 포인터들이다.

포인터 배열 선언

포인터 배열 ap에는 10개의 원소가 있고, 각각의 원소들은 정수형 포인터이므로 정수형 변수들의 주소가 저장될 것이다.

포인터 배열 사용 예

포인터 배열 중에 가장 많이 사용되는 형태는 문자형 포인터 배열이다. 문자형 포인터 배열을 이용하면 효율적으로 여러 개의 문자열을 저장할 수 있다.


과일 이름을 여러 개를 저장한다고 하였을 때, 2차원 배열을 사용하였다고 가정해보자

2차원 배열을 이용했을 경우

2차원 배열을 사용하면 각 행은 가장 긴 문자열을 저장할 수 있도록 충분히 크게 선언되어야 한다.

하지만 짧은 문자열을 저장하는 행에서는 공간 낭비가 일어나게 된다.

(주황색으로 색칠한 부분이 낭비되는 공간이다.)

포인터 배열을 이용했을 경우

하지만 문자열 포인터 배열을 이용하면 각행들의 길이가 가변적으로 변할 수 있다. 따라서 메모리 낭비가 되지 않는다.

배열 포인터

배열 포인터는 배열을 가리키는 포인터이다.

배열 포인터 선언

 

배열 포인터의 예

이런 식으로 배열 포인터는 저장된다. 이젠 포인터 배열과 배열 포인터의 차이를 알 수 있을 것이다! 


[출처] c언어 Express

728x90

'Programming > C Language' 카테고리의 다른 글

[C언어] 그래프의 개요  (0) 2021.12.26
[C언어] 문자열  (0) 2020.03.30
[C언어] 배열  (2) 2020.03.28
[C언어] 함수  (2) 2020.03.27
[C언어] 반복문  (4) 2020.03.26