C_C++

(C언어) 1차원 배열과 포인터

고니자니 2022. 11. 6. 15:12
반응형

 

1차원 배열과 포인터에 대해 설명합니다.

배열은 메모리상에 연속적으로 공간을 확보하고 있어서, 포인터를 이용해서 배열의 원소를 다루기 쉽습니다.

포인터를 배열처럼 다룰 수 있으며, 배열을 포인터처럼 다룰 수도 있습니다.

 

다음과 같은 1차원배열의 선언을 살펴보겠습니다.

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

[암기] 배열명은 해당 배열의 시작주소를 나타냅니다.

 

 

이 배열의 시작주소는 다음과 같이 표현할 수 있습니다.

a
&a[0]
&a

주의할 점은 a와 &a의 시작 주소는 같지만, 그 의미는 서로 다릅니다.

&a는 배열 전체의 시작주소라 말할 수 있습니다. 그래서 &a+1의 주소는 배열 전체의 크기 다음 위치를 나타냅니다.

a+1과 &a+1의 주소가 다름에 주의하여야 합니다.

 

배열명은 배열의 시작주소이므로 다음과 같은 연산이 가능하거나 불가능합니다.

a
a+1
a+2
a++     -- 배열명으로 ++ 연산은 불가능합니다.
--a      -- 배열명으로 --  연산은 불가능합니다.

 

배열의 시작 주소와 a+1, &a+1의 주소 출력

#include <stdio.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };

	printf("%p\n", a);
	printf("%p\n", &a);
	printf("%p\n", a + 1);
	printf("%p\n", &a+1);

	return 0;
}

 

예제

다음 예제는 배열 이름을 (포인터처럼 사용) 사용해서 배열의 각 원소의 주소와 값을 출력하는 예제입니다.

#include <stdio.h>
int main()
{
	int a[5] = { 1,2,3,4,5 };
	int i;

	for (i = 0; i < 5; i++)
		printf("%p  %d\n", a + i, *(a + i));

	return 0;
}

 

 

*p++는 포인터 p의 값(*p)을 사용하고, 포인터를 1 증가하는 식입니다.

*p++;

위 코드는 아래 2줄과 동일합니다.
*p;
p++;

 

예제

#include <stdio.h>
int main()
{
	char s[] = "Hello, C";
	char* p = s;
	
	while(*p)
		printf("%c\n", *p++);

	return 0;
}

 

예제

#include <stdio.h>
int main()
{
	char s[] = "Hello, C";
	char* p = s;
	
	while(*p)
		printf("%s\n", p++);

	return 0;
}

 

배열을 함수의 매개변수로 사용하기

 

다음 예제는 매개 변수로 배열을 받아서, 포인터처럼 사용하는 예제입니다.

#include <stdio.h>

void print(int a[], int size)
{
	int i;
	for(i=0; i<size; i++)
		printf("%d ", *(a + i));
	printf("\n");
}
int main()
{
	int a[5] = { 1,2,3,4,5 };
	print(a, 5);

	return 0;
}

 

다음 예제는 함수의 매개변수에서 배열을 포인터로 받아서 배열처럼 사용하는 예제입니다.

#include <stdio.h>

void print(int *a, int size)
{
	int i;
	for(i=0; i<size; i++)
		printf("%d ", a[i]);
	printf("\n");
}
int main()
{
	int a[5] = { 1,2,3,4,5 };
	print(a, 5);

	return 0;
}

반응형