C의 포인터 배열
C에서 포인터 배열은 메모리 위치를 참조하는 인덱스 포인터 변수의 동종 모음입니다. 이는 일반적으로 C 프로그램에서 유사한 데이터 유형의 여러 메모리 위치를 가리키고 싶을 때 C 프로그래밍에서 사용됩니다. 데이터를 가리키는 포인터를 역참조하여 데이터에 액세스할 수 있습니다.
통사론:
pointer_type *array_name [array_size];
여기,
- 포인터_유형: 포인터가 가리키는 데이터 유형입니다. array_name: 포인터 배열의 이름입니다. array_size: 포인터 배열의 크기입니다.
메모: 단일 변경이 완전히 다른 것을 의미하므로 다양한 유형의 포인터 선언 배열에서 연산자 우선 순위와 연관성을 염두에 두는 것이 중요합니다. 예를 들어 *array_name을 괄호로 묶으면 array_name이 배열에 대한 포인터라는 의미입니다.
예:
씨
// C program to demonstrate the use of array of pointers> #include> int> main()> {> > // declaring some temp variables> > int> var1 = 10;> > int> var2 = 20;> > int> var3 = 30;> > // array of pointers to integers> > int> * ptr_arr[3] = { &var1, &var2, &var3 };> > // traversing using loop> > for> (> int> i = 0; i <3; i++) {> > printf> (> 'Value of var%d: %d Address: %p
'> , i + 1, *ptr_arr[i], ptr_arr[i]);> > }> > return> 0;> }> |
산출
Value of var1: 10 Address: 0x7fff1ac82484 Value of var2: 20 Address: 0x7fff1ac82488 Value of var3: 30 Address: 0x7fff1ac8248c
설명:
위의 예에서 볼 수 있듯이 배열의 각 요소는 정수를 가리키는 포인터입니다. 먼저 배열 요소를 선택한 다음 이를 역참조하여 값을 가져옴으로써 이러한 정수의 값에 액세스할 수 있습니다.
문자에 대한 포인터 배열
포인터 배열의 주요 응용 프로그램 중 하나는 여러 문자열을 문자에 대한 포인터 배열로 저장하는 것입니다. 여기서 배열의 각 포인터는 문자열의 첫 번째 문자를 가리키는 문자 포인터입니다.
통사론:
char *array_name [array_size];
그런 다음 이 포인터에 임의 길이의 문자열을 할당할 수 있습니다.
예:
씨
char> * arr[5]> > = {> 'gfg'> ,> 'geek'> ,> 'Geek'> ,> 'Geeks'> ,> 'techcodeview.com'> }> |
이 문자열 저장 방법은 전통적인 문자열 배열의 장점을 가지고 있습니다. 다음 두 가지 예를 고려하십시오.
예시 1:
씨
// C Program to print Array of strings without array of pointers> #include> int> main()> {> > char> str[3][10] = {> 'Geek'> ,> 'Geeks'> ,> 'Geekfor'> };> > printf> (> 'String array Elements are:
'> );> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , str[i]);> > }> > return> 0;> }> |
산출
String array Elements are: Geek Geeks Geekfor
위 프로그램에서는 문자열 배열의 3개 행과 10개 열을 선언했습니다. 그러나 문자열 배열의 크기가 미리 정의되어 있기 때문에 메모리가 제대로 활용되지 않거나 사용되지 않은 채로 남아 있으면 프로그램의 공간 소비가 증가합니다. 이제 동일한 문자열을 포인터 배열에 저장해 보겠습니다.
예시 2:
씨
// C program to illustrate the use of array of pointers to> // characters> #include> int> main()> {> > char> * arr[3] = {> 'geek'> ,> 'Geeks'> ,> 'Geeksfor'> };> > for> (> int> i = 0; i <3; i++) {> > printf> (> '%s
'> , arr[i]);> > }> > return> 0;> }> |
산출
geek Geeks Geeksfor
여기서 사용된 총 메모리는 빈 공간을 남기지 않고 문자열과 포인터를 저장하는 데 필요한 메모리이므로 낭비되는 공간을 많이 절약할 수 있습니다. 아래 이미지를 통해 이를 이해할 수 있습니다.
문자에 대한 포인터 배열이 차지하는 공간은 포인터를 저장하는 데 필요한 메모리를 제외한 단색 녹색 블록으로 표시되는 반면, 문자열 배열이 차지하는 공간은 단색 블록과 밝은 녹색 블록을 모두 포함합니다.
다양한 유형에 대한 포인터 배열
int, char, float 등과 같은 기본 데이터 유형에 대한 포인터 배열을 정의할 수 있을 뿐만 아니라 배열, 구조 등과 같은 파생 및 사용자 정의 데이터 유형에 대해서도 포인터 배열을 정의할 수 있습니다. 아래 예를 살펴보겠습니다. 다양한 작업을 수행하기 위한 함수를 가리키는 포인터 배열을 만듭니다.
예:
씨
// C program to illustrate the use of array of pointers to> // function> #include> // some basic arithmetic operations> void> add(> int> a,> int> b) {> > printf> (> 'Sum : %d
'> , a + b);> }> void> subtract(> int> a,> int> b) {> > printf> (> 'Difference : %d
'> , a - b);> }> void> multiply(> int> a,> int> b) {> > printf> (> 'Product : %d
'> , a * b);> }> void> divide(> int> a,> int> b) {> > printf> (> 'Quotient : %d'> , a / b);> }> int> main() {> > int> x = 50, y = 5;> > // array of pointers to function of return type int> > void> (*arr[4])(> int> ,> int> )> > = { &add, &subtract, &multiply, ÷ };> > for> (> int> i = 0; i <4; i++) {> > arr[i](x, y);> > }> > return> 0;> }> |
산출
Sum : 55 Difference : 45 Product : 250 Quotient : 10
포인터 배열의 적용
포인터 배열은 다양한 경우에 유용합니다. 이러한 응용 프로그램 중 일부는 다음과 같습니다.
- 여러 문자열을 저장하는 데 가장 일반적으로 사용됩니다.
- 또한 C에서 LinkedHashMap을 구현하는 데 사용되며 해싱에서 충돌 해결의 연결 기술에도 사용됩니다.
- 버킷 정렬과 같은 정렬 알고리즘에 사용됩니다.
- 모든 포인터 유형과 함께 사용할 수 있으므로 여러 엔터티에 대한 별도의 선언이 있고 이를 단일 위치에 저장하려는 경우 유용합니다.
포인터 배열의 단점
포인터 배열에는 단점도 상당하므로 장점이 단점보다 클 때 사용해야 합니다. 포인터 배열의 몇 가지 단점은 다음과 같습니다.
- 더 높은 메모리 소비: 포인터 배열은 포인터를 저장하는 데 추가 공간이 필요하기 때문에 일반 배열에 비해 더 많은 메모리가 필요합니다. 복잡성: 포인터 배열은 간단한 배열에 비해 사용하기 복잡할 수 있습니다. 버그가 발생하기 쉬움: 포인터를 사용할 때 포인터와 관련된 모든 버그가 함께 제공되므로 주의 깊게 처리해야 합니다.
관련 기사: 배열에 대한 포인터 | 배열 포인터