배열과 포인터
1. 첨자 연산
배열의 내부적 처리 :
배열은 정보를 저장하는 가장 기본적인 자료 구조로서 실용성이 높다. 포인터는 조금 어렵기는 하지만 C언어를 다른 언어와 구분하는
가장 큰 특징이다. 이 둘은 아주 긴밀한 연관을 맺고 있으며 상호 보완적이면서 또한 일정 부분에 있어서는 대체도 가능하다.
배열의 정보저장 능력과 포인터의 정보 가공 능력이 결합되면 복잡한 현실 문제들을 해결하는데 아주 강력한 무기가 된다.
- C는 내부적으로 1차원 배열만 지원한다. 2차원 이상의 다차원 배열은 1차원 배열의 확장에 불과하다. C에는 2차원 배열이라는 것이 없다.
But 배열끼리 중첩이 가능하기 때문에 외부적으로는 다차원 배열도 지원하는 셈이다.
- 배열을 구성하는 배열 요소의 타입에는 전혀 제한이 없다. T형 변수를 선언할 수 있으면 T형 배열도 언제나 선언할 수 있다. 배열도
유도형 타입의 일종이며 따라서 배열 그 자체가 배열의 요소가 될 수 있다.
포인터 배열 :
포인터 배열이란 요소가 포인터형인 배열이다. T형이 있을 때 T형 포인터를 선언할 수 있고 T형 배열도 선언할 수 있으므로 T형 포인터 배열도 선언할 수 있다.
ex )
Int *arpi[5]; |
description )
* 가 앞쪽에 있으므로 arpi는 먼저 정수형 포인터가 되고 다음으로 []에 의해 그런 포인터 변수 5개를 모아 배열을 선언하게된다.
정수형 변수나 정수형 배열을 가리킬 수 있다.
포인터와 배열 총정리 :
선언문 1
int i; // 정수형 변수를 i라는 이름으로 선언 4byte 할당 |
선언문 2
int ar[n]; |
int ar[n]; // 정수형 변수 n개를 모아 놓은 정수형 배열 n이 5라고 할때 sizeof(ar)은 20이 된다.
int *pi; |
int *pi; // 정수형 변수 하나의 위치를 가리킬 수 있는 포인터 , 메모리는 항상 4byte , &i 같은 정수형 변수의 주소값을 대입 받는다.
선언문 3
pi=(int *)malloc(n*sizeof(int)); |
pi=(int *)malloc(n*sizeof(int)); // 동적 메모리할당
ar 과 똑같은 자격을 가지며 정수형 배열처럼 행세할 수 있다.
위에 선언문처럼 포인터를 배열과 거의 비슷하게 사용할 수 있다. 배열과 포인터는 완전히 같다고 할 수 있는가하면
그렇지 않고 차이점도 많이 있다.
차이점
1. 포인터는 변수인데 , 배열은 상수이다.
- pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할 때 그 위치가 이미
고정 되어 있다.
2. pi가 가리키는 배열의 크기는 동적으로 결정할 수있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
- 가변의 배열이 필요하면 int * 형 포인터 변수를 선언한 후 malloc으로 할당해서 사용해야한다.
3. 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4byte의 크기 밖에 차지하지 않음으로 함수로 전달할 수 있다.
4. 배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작은 속도차이가 있다.
- 대략 포인터가 배열보다 두 배 정도 빠르다.
선언문 4
int *api[5]; |
api 배열을 위해 할당되는 메모리는 20바이트밖에 안 되지만 각 요소는 int * 형이므로 동적으로 할당된 번지를 api의
각 요소에 대입하면 api는 정수형 배열을 가리키는 포인터의 배열이 될 수 있다.
int **papi; |
papi의 요소인 papi[n]은 int * 타입으로서 정수형 배열을 가리킬 수 있는 포인터이다. 이런 포인터 변수 여러 개를 모으면 포인터 배열이 되고 그런 배열을 가리키는 포인터를 선언하면 바로 papi가 된다. 그래서 papi는 포인터-배열-포인터가 되며 api 같은 포인터 배열을 가리킬 수 있다.
int **apapi[3]; |
정수형 변수의 집합인 배열을 가리킬 수 있는 포인터의 집합인 배열을 가리키는 포인터의 집합인 배열이다.
ㅅㅂ??
'C,C++' 카테고리의 다른 글
[C++]객체지향 프로그래밍 _ 함수(1) (0) | 2019.05.20 |
---|---|
[C#] Class 클래스 사용_Random 과 List (0) | 2019.04.11 |
[C,C++] 이중 포인터 (0) | 2019.02.25 |
[C,C++] 포인터 동적 메모리 할당 (0) | 2019.02.25 |
[C,C++] 포인터 연산 (0) | 2019.02.25 |