[C 기초 - 포인터 연산과 배열]

Junyeong Fred Kim·2021년 12월 6일
0

C언어

목록 보기
17/21

포인터 연산과 배열


배열의 주소는 연속되어있다. 배열의 이름은 포인터 변수와 같은 기능을 하며, 첫번째 요소의 주소값을 타나낸다.

#include <stdio.h>

int main()
{
	int arr[5] = {10, 20, 30, 40, 50};
	int *arrPtr = arr;

	printf("%d\n", *arrPtr);
	printf("%d\n", arr[0]);

	return 0;
}

출력

10
10

출력 설명

위와 같이 & 연산자를 쓰지 않아도 arr 이름 자체가 주소값이기 때문에, 바로 포인터에 대입이 가능하다. arr 이름은 배열의 첫번째 원소의 주소값이므로 arrPtr이 가리키고 있는 값을 출력해보면 첫번째 원소값인 10이 출력된다.

scanf로 입력받을 때, 배열 이름이 주소값이기 때문에 굳이 &연산자를 붙여서 주소값을 나타내줄 필요가 없는 것이다.

포인터 연산


포인터 변수도 일반 변수처럼 값이 들어가 있는 변수기 때문에 증감 연산을 할 수 있다. ++, --와 같은 전/후위 연산과 +,-연산자 같은 일반 덧셈과 뺄셈이 가능하다. 단, 곱셈, 나눗셈 연산은 하지 못합니다.

#include <stdio.h>

int main()
{
	int arr[5] = {10, 20, 30, 40, 50};
	double arr2[5] = {10.1, 20.2, 30.3, 40.4, 50.5};
	int *arrPtr = arr;
	double *arrPtr2 = arr2;

	printf("포인터 주소 : %d %d\n", arrPtr++, arrPtr2++);
	printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
	printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);

	arrPtr += 2;
	arrPtr2 += 2;

	printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
	printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);

	return 0;
}

출력

포인터 주소 : 3826688 3826720
증가 연산 후 : 3826692 3826728
변수 값 : 20 20.20
증가 연산 후 : 3826700 3826744
변수 값 : 40 40.40

출력 설명

int형 포인터인 arrPtr는 1을 더할때마다 4씩 증가하고, double형 포인터인 arrPtr2는 8씩 증가하고, 2를 더했더니 arrPtr은 8, arrPtr2는 16만큼 증가한다.

즉, 포인터 변수가 n만큼 더하거나 뺄 때 자료형의 크기 x n 만큼 증가한다는 것이다. 감소 연산도 동일하다.

그러므로, 포인터의 이름은 배열의 첫번째 원소의 주소를 가리키므로, i x 자료형의 크기만큼 더해지면 결국 배열 i와 같게 되는 것이다.

*(arr+i) == arr[i]

포인터로 버블 정렬 함수 만들기


코드

#include <stdio.h>

void bubbleSort(int *arr)
{
    int temp;	
    for(int i=0; i<9; i++)
    {
	    for(int j=0; j<9-i; j++)
	    {
		    if(*(arr+j)>*(arr+j+1))
		    {
			    temp = *(arr+j);
			    *(arr+j) = *(arr+j+1);
			    *(arr+j+1) = temp;
		    }
	    }		
    }
}

int main()
{
	int arr[10];
	for(int i=0; i<10; i++)
	{
		scanf("%d", &arr[i]);
	}

	bubbleSort(arr);

	for(int i=0; i<10; i++)
	{
		printf("%d ", arr[i]);
	}
	
	return 0;
}

입력

10 5 8 2 9 1 4 6 11 15

출력

1 2 4 5 6 8 9 10 11 15

profile
기억보다 기록

0개의 댓글