웹사이트 검색

Linux C 프로그래밍 자습서 19부: 포인터 및 배열


이 페이지에서

  1. 포인터 및 배열
  2. 결론

지금까지 이 진행 중인 C 프로그래밍 자습서 시리즈에서 포인터의 기본 사항에 대해 간략하게 논의했습니다. 그러나 논의해야 할 몇 가지 포인터 관련 개념이 더 있습니다. 따라서 이 자습서에서는 포인터와 배열의 개념에 대해 설명합니다.

포인터와 배열을 시작하기 전에 포인터 자체의 기본 개념을 빠르게 새로 고칩니다. 포인터는 주소를 담을 수 있는 특별한 종류의 변수입니다. 예를 들어 문자에 대한 포인터 ptr은 다음과 같은 방식으로 선언할 수 있습니다.

char *ptr;

그리고 앰퍼샌드 기호를 사용하여 주소를 저장할 수 있습니다. 예를 들면 다음과 같습니다.

char c = 'a';
ptr = &c;

이제 포인터 ptr에는 변수 c의 주소가 포함됩니다. 또는 ptr이 이제 변수 c를 가리킨다고 말할 수도 있습니다.

포인터가 가리키는 변수의 값에 액세스하거나 조작하려면 * 연산자를 사용할 수 있습니다. 예를 들어 변수 c의 값을 a에서 b로 변경하려면 포인터 ptr을 다음과 같이 사용할 수 있습니다.

*ptr = 'b';

다음 프로그램은 지금까지 논의한 이러한 기본 포인터 개념에 대한 더 나은 아이디어를 제공합니다.

#include <stdio.h>

int main()
{
char c = 'a';
char *ptr = &c;

*ptr = 'b';

printf ("variable c = %c", c);

return 0;
}

이 프로그램의 출력은 다음과 같습니다.

variable c = b

포인터를 사용하여 볼 수 있듯이 변수의 값이 변경되었습니다.

포인터와 배열

C 코드를 작성하고 읽는 데 점점 더 많은 시간을 할애할수록 포인터와 배열이 함께 사용되는 경우가 많다는 것을 알게 될 것입니다. 예를 들어 포인터를 사용하여 배열의 개별 요소에 액세스할 수 있습니다. 다음 코드를 고려하십시오.

...
...
...
char arr[] = {'a','b','c','d','e'}
char *ptr;
ptr = &arr[0]
...
...
...

여기에서 포인터 ptr은 배열 arr의 첫 번째 요소를 가리키며 인덱스로 말하면 배열의 0 위치에 있습니다. 이제 ptr과 함께 * 연산자를 사용하여 포인터가 가리키는 값에 액세스/조작할 수 있습니다.

계속해서 배열의 첫 번째 요소를 가리키는 포인터가 있으면 배열의 다른 요소에도 쉽게 액세스할 수 있습니다. 예를 들어 위의 코드 발췌와 관련하여 다음 표현식을 어디에서나 사용할 수 있습니다.

*(ptr+1)

그런 다음 배열의 두 번째 요소에 액세스할 수 있습니다. 일반적으로 다음과 같은 방법을 사용합니다.

arr[1] 

따라서 효과적으로 ptr에 1을 추가하면 배열의 다음 요소 주소가 사용되며 *를 사용하면 해당 주소에 저장된 값에 액세스할 수 있습니다. 마찬가지로 2를 더하면 세 번째 요소가 됩니다... 등등.

방금 논의한 내용에 대한 명확한 아이디어를 제공하는 프로그램이 있습니다.

#include <stdio.h>

int main()
{
char arr[] = {'a','b','c','d','e'};
char *ptr = &arr[0];

for(int i=0;i<strlen(arr);i++)
printf ("arr[%d] is %c \n", i, *(ptr+i));

return 0;
}

결과는 다음과 같습니다.

arr[0] is a 
arr[1] is b
arr[2] is c
arr[3] is d
arr[4] is e

보시다시피 *(ptr+i) - i가 0에서 배열의 마지막 인덱스까지 다양함 - 배열의 모든 요소에 액세스할 수 있습니다.

참고 1: 코드에서 사용될 때 배열의 이름은 배열의 기본 주소를 제공합니다. 이는 배열의 이름과 첫 번째 요소의 주소가 하나이며 동일한 것임을 의미합니다. 따라서 배열 arr의 맥락에서 &arr[0]과 arr은 하나이며 동일한 것입니다. 이는 다른 요소에도 적용됩니다. 의미 &arr[2]는 (arr+2) 등으로도 쓸 수 있습니다.

참고 2: 위의 참고에서 논의한 내용을 확장하면 모든 배열 요소 표현을 포인터 표현으로 나눌 수 있습니다. 예: arr[2]는 *(arr + 2)와 동일합니다.

참고 3: 배열 주소를 포인터에 할당할 수 있지만 그 반대는 유효하지 않습니다. 또한 포인터와 달리 배열 이름에 ++ 또는 -- 연산자를 사용할 수 없습니다. 대체로 배열 요소가 원래 위치한 주소를 변경할 수 없습니다.

결론

이 튜토리얼은 포인터와 배열의 개념, 그것들이 어떻게 관련되어 있고 포인터를 통해 배열 요소에 액세스하는 방법에 중점을 두었습니다. 마지막으로 배열에 대한 포인터를 활용하는 코드와 관련하여 몇 가지 중요한 사항에 대해서도 논의했습니다.

이러한 개념이 작동하는 방식에 대한 더 나은 아이디어를 얻으려면 컴퓨터에서 로컬로 이러한 개념을 시도하고 의심스럽거나 질문이 있는 경우 아래에 의견을 남겨주세요.