https://blog.hyomin.xyz/10

포인터란 자료가 저장되는 기억장치의 기억주소를 가리키는 지시자로써 포인터는 다른 기억장소의 자료를 참조하는데 사용되는 데이터입니다.

 

1. 포인터를 써야 하는 이유

 

어떠한 변수이든지 어떠한 버퍼를 할당 받아서 사용하는데모든 변수의 저장과 참조는 변수가 저장될 혹은 저장된 주소를 알아야 가능하다그래서 컴퓨터는 변수를 참조할 때 그 변수가 저장되어 있는 주소를 먼저 찾아내고 그 주소가 가리키는 내용을 참조하게 된다이렇게 변수의 주소를 저장하거나 사용하기 위한 변수가 포인터이다.

포인터를 사용하면 간결하고 효율적인 표현과 처리가 가능하고 더 빠른 기계어 코드를 생성할 수 있으며복잡한 자료 구조(배열구조체 등)와 함수의 쉬운 접근이 가능하다또한 포인터를 사용하지 않았을 때 코드로 표현할 수 없는 경우가 생길 수 있다.

 

2. 포인터를 사용하면 어떤 장점이 있을까?

 

메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이


예제_

#include <stdio.h>

int main() 

int a=5; 

int *b; 

b = &a; 

printf("a = %d, &a = %d, b = %d, *b = %d\n", a, &a, b, *b); 

*b += 5; 

printf("a = %d, &a = %p, b = %p, *b = %d\n", a, &a, b, *b); 

              return 0; 

}


-----------------------------------------------------------------------

a = 5, &a = 1245052, b = 1245052, *b = 5 

a = 10, &a = 0012FF7C, b = 0012FF7C, *b = 10


위 예제에서 보면 정수형 변수 a 5로 초기화되고 정수형 포인터 변수 b a의 시작주소가 대입됩니다

따라서 주소 b가 가리키는 내용인 *b 3이 될 것입니다이렇듯이 변수들의 접근에 용이합니다.

 

메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이

동적 할당된 메모리 영역(힙 영역)에 접근과 조작 용이

한 함수에서 다른 함수로 배열이나 문자열을 편리하게 보낼 수 있음

복잡한 자료구조를 효율적으로 처리

배열로 생성할 수 없는 데이터를 생성

메모리 공간을 효율적 사용

- call by reference에 의한 전역 변수의 사용을 억제

 

3. 포인터의 단점

 

포인터 변수는 주소를 직접적으로 컨트롤하기 때문에 예외 처리가 확실하지 않을 경우 예상치 못한 문제가 많이 발생. ( 널 포인트 같은 경우에 바로 접근할 경우 예외 발생)

선언만 하고 초기화를 하지않을 경우 쓰레기 주소를 가리키고 있기 때문에 사용에 주의해야 함.

포인터 변수는 주소를 직접 참조하기 때문에 의도하지않게 원본의 값이 수정 될 수 있다.

오류를 범하기 쉽고 기교적인 프로그램이 되기 쉽다.

프로그램의 이해와 버그 찾기가 어렵다.

메모리 절대 번지 접근 시 시스템 오류를 초래한다.

 

 하지만 단점 보다는 장점이 더 많아서 포인터를 사용한다고 한다.

 

 

4. 포인터와 배열의 차이

 배열과 포인터는 완전 같지는 않다고 한다그럼 차이점은 무엇일까?

 

포인터는 변수이지만 배열은 상수이다.

         int *p와 int arr[n]이 있다고 할 때, p는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가르킬 수 있지만 arr는 선언 할 때 그 위치가 이

미 고정되므로 다른 대상을 가리킬 수 없다. arr로는 오로지 배열의 선두 번지를 읽을 수 있을 뿐이다.


가리키는 배열의 크키는 동적으로 결정할 수 있지만 arr이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
 
고정된 길이의 배열이 필요하면 int arr[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변길이의 배열이 필요하면 int *형의 포인터 변수를 선언한    malloc으로 할당해서 사용해야 한다포인터로 할당한 배열은 실행 중에라도 realloc으로 크기를 재할당하여 변경할 수 있다.
 
- 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트와 크기밖에 차지하지 않으므로 함수로 전달할 수 있다
 
그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다

- 동작의 속도 차이가 있다
 
배열은 매번 배열선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다. *p p가 가리키는 곳을 바로 읽지만 ar[n] *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다포인터가 배열보다 두배 정도 빠르다.