Blog/JAVA기반 스마트웹 개발2021

프로그래밍 언어 활용 part 1 - 배열 포인터 처리

고구마달랭이 2021. 8. 1. 17:16

배열 포인터 처리

[학습내용] [학습목표]
포인터 배열 기초
고급 포인터 배열 기술
배열을 포인터 배열로 참조하는 방법을 구현할 수 있다.
▪ 구조체를 포인터 배열로 참조하는 방법을 구현할 수 있다.

포인터 배열 기초

 

주소를 저장하는 배열

 

▪ 포인터 배열의 각 원소로 변수의 주소를 저장함

▪ 배열의 각 원소가 포인터형이므로, 원소가 가리키는 변수에 접근 하려면 배열의 원소 앞에 간접 참조 연산자 *를 사용해야 함

 

 

1. 1차원 포인터 배열

 

int a = 10, b = 20, c = 30, d = 40, e = 50;
int* arr[5] = {&a, &b, &c, &d, &e};		//int 변수의 주소로 arr 배열의 원소를 초기화 함
int i;

for( i = 0 ; i < 5 ; i++ )

printf(“%d”, *arr[i]) ;				//arr[i]는 int*형이므로 간접 참조 연산자를 사용할 수 있음

 

 

int main(){

int a=1, b=3, c=5, d=7, e=9;
int* arr[5] = {&a, &b, &c, &d, &e};
int i;

for( i = 0 ; i < 5 ; i++ )

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

return 0;
}

 


 

2. 2차원 포인터 배열

▪ 포인터 배열의 각 원소에 배열의 시작 주소를 저장

int x[3] = {1, 2, 3};

int y[3] = {4, 5, 6};

int z[3] = {7, 8, 9};

int* arr[3] = {x, y, z};			//포인터 배열의 원소를 int 배열의 시작 주소로 초기화 함

 

 

▪ arr[i]가 int 배열의 시작 주소로 초기화 되었을 때, arr[i]가 가리키는 배열의 원소에 접근하려면 arr[i][j]라고 씀

for( i = 0 ; i < 3 ; i++ ){

for( j = 0 ; j < 3 ; j++ )

printf(“&d”, arr[i][j]);			//*(arr[i]+j)와 같은 의미
printf(“\n”);
}

 

int main(void){

	int x[3] = {1, 2, 3};
	int y[3] = {4, 5, 6}; 
	int z[3] = {7, 8, 9};
	int* arr[3] = {x, y, z};
	int i, j;

	for( i = 0 ; i < 3 ; i++ ){

		for( j = 0 ; j < 3 ; j++)
		printf("%d ", arr[i][j]);
		printf("\n");
	}

	return 0;
}

고급 포인터 배열 기술

 

1. 구조체 포인터 배열

▪ 구조체 배열은 메모리를 많이 사용하므로 비효율적임

▪ 구조체 포인터 배열을 이용하면 구조체는 동적 메모리에 할당하고 그 주소만 포인터 배열에 넣어두고 사용할 수 있음

▪ 구조체 포인터 배열의 메모리 구조

STUDENT s1;
STUDENT s2;
STUDENT s3;
STUDENT* std[3] = {&s1, &s2, &s3};

printf(“%s”, std[i] → name);

 

 


 

2. 2차원 배열 포인터 처리

 

행 단위 포인터 변수

int arr[3][5] = {

{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
};

int (*p)[5] = &arr[0];			//p를 int 5개 짜리 배열인 arr[0]의 주소로 초기화 함

 

 

배열에 대한 포인터와 이차원 배열

▪ 배열에 대한 포인터를 &arr[0]으로 초기화하는 대신, 간단하게 arr로 초기화할 수 있음

int (*p)[5] = arr;			//arr는 &arr[0]과 같은 의미

 

▪ 배열에 대한 포인터를 &arr[0]으로 초기화하는 대신, 간단하게 arr로 초기화할 수 있음

int i, j;

for ( i = 0 ; i < 3 ; i++ ){

	for ( j = 0 ; j < 5 ; j++ )
	printf(“%d”, p[i][j]);		//p[i][j]는 이차원 배열의 원소 arr[i][j]를 의미
	printf(“\n”)
}

 

 


 

 

학습정리

 

1. 포인터 배열 기초

▪ 각 변수의 주소를 배열과 같이 묶어서 처리하는 것이 가능함

▪ 배열의 주소를 포인터 배열에 저장하면 2차원 배열과 같이 참조할 수 있음

 

2. 고급 포인터 배열 기술

▪ 구조체 포인터 배열은 구조체를 이용하는 것보다 메모리 사용 측면에서 더 효율적임

▪ 2차원 배열은 열 크기를 기준으로 포인터 변수를 선언할 수 있음