easy software

C언어 포인터와 연산, 포인터와 배열의 관계 본문

C언어/포인터와 배열

C언어 포인터와 연산, 포인터와 배열의 관계

JAVA 웹개발자 2015. 1. 17. 17:44

안녕하세요.

 

이번시간에는 포인터와 배열의 관계, 연산에 대해 알아보고자 합니다. 간단한 이론만 진행합니다.

 

 

1. 배열과 포인터의 관계

 

우선 배열과 포인터

 

int arr[5] = {1,2,3,4,5};

 

int* ptr = arr;

 

를 선언하겠습니다.

 

여기서 문제입니다.

 

printf("%d", arr);

 

를 할 경우에 어떤 값이 출력될까요?

 

답은 1입니다.

 

배열의 이름은 배열의 맨앞 값의 시작주소를 가지고 있습니다.

 

만약 위의 값 1의 주소가 0x1000 이라고 가정하면,

 

arr는 0x1000이라는 시작주소를 가리키고 있는것입니다.

 

 

 

 

 

그렇다면 arr도 포인터 아닌가요? 라는 질문을 하셔야 합니다.

 

정답은 맞습니다.

 

arr도 포인터입니다.

 

그리고 위에서 ptr에 arr을 = 연산시켰죠?

 

그러므로 ptr도 arr[0]의 시작주소를 가지고 있습니다.

 

결론! 포인터가 할 수 있는 일은 배열도 할 수 있다.

 

그리고 배열이 할 수 있는 일은 포인터도 할 수 있다.

 

다만, 차이점은? 포인터는 변수이고, 배열은 상수이다.

 

아래와 같은 코드는 오류가 발생된다!

 

int a[5] = {1,2,3,4,5};

 

int b = 10;

 

a = &b; //a는 상수이므로 오류!

 

그리고 위의 사실을 근거하여 포인터는 배열의 이름처럼 사용할 수 있습니다.

 

int arr[5] = {1,2,3,4,5};

 

int* ptr = arr;

 

에서 arr[0] == ptr[0], a[1] == ptr[1]... 이란 뜻입니다.

 

어때요? 배열과 포인터는 거의 완전 똑같다고 볼 수도 있겠습니다.

 

 

2. 포인터의 연산

 

포인터의 연산은 증가와 감소만 가능합니다.

 

곱셈과 나눗셈 연산은 지원하지 않습니다.

 

그럼 몇 가지 연산에 대해 나열해 보겠습니다.

 

int* ptr;

 

ptr1++;

 

ptr1 += 3;

 

- -ptr1;

 

ptr1 = ptr1+2;

 

이런 연산들이 가능합니다.

 

그럼 ++연산을 했을때는 어떤 값이 증가가 될까요?

 

포인터는 주소값을 가리키고 있기 때문에 메모리상의 주소 값이 증가됩니다.

 

 

 

다만, int형은 4, double형은 8, char형은 1바이트씩 메모리주소가 증가됩니다.

 

만약 2를 증가시켰다면, int형은 8, double형은 16... 으로 증가될 것입니다.

 

 

3. 배열의 이름을 포인터처럼 사용

 

짧지만 무척 중요한 부분입니다.

 

결론부터 말씀드리면 arr[i] = = *(arr+i) 입니다.

 

위에서 포인터를 배열의 이름처럼 사용한다는 설명을 드렸습니다.

 

이번에는 배열의 이름을 포인터 처럼 사용하는 것입니다.

 

int arr[5] = {1,2,3,4,5};에서 *(arr+1)은 무엇일까요?

 

arr은 arr[]의 시작주소를 가리킨다고 위에서 설명드렸습니다.

 

그러므로 시작주소에 int형의 sizeof인 4를 더해서 arr[1]을 가리키게 되는 것입니다.

 

마찬가지로 *(arr+2)는 arr[2]과 동일합니다.

 

double은 8바이트, char형은 1바이트씩 증가합니다.

Comments