C 프로그래밍 · 2 min read · Nov 15, 2025

리눅스 C 프로그래밍 튜토리얼 20 - 포인터 주소 산술

이전 튜토리얼에서는 C 프로그래밍 시리즈에서 포인터에 대해 조금 자세히 논의했습니다. 그 논의를 확장하여, 여기서는 포인터와 관련된 몇 가지 더 논의할 가치가 있는 개념을 다루겠습니다. 그러면 더 이상 지체하지 않고 시작하겠습니다.

C에서의 포인터 주소 산술

먼저, 포인터를 다룰 때 주소 산술에 집중해 보겠습니다. 이전 튜토리얼에서 논의한 것처럼, 배열을 가리키는 포인터가 있다면(예를 들어, 배열의 시작 부분을 가리키는 경우) 해당 배열의 요소에 접근하는 것은 매우 쉽습니다. 다음은 예제입니다:

#include   
  
int main()  
{  
    char arr[]={'a','b','c','d'};  
    int a[]={1,2,3,4};  
   
    char *ptr = arr;  
    int *p = a;  
   
    for(int i=0; i

따라서 이 코드에서는 ‘arr’과 ‘a’라는 두 개의 배열이 있습니다. 첫 번째는 문자 배열이고, 두 번째는 정수 배열입니다. 그런 다음 이 배열을 가리키는 두 개의 포인터 - 각각 ‘ptr’과 ‘p’가 있습니다. 그런 다음 현재 포인터가 가리키고 있는 주소와 해당 주소에 포함된 값을 출력하는 몇 개의 ‘for’ 루프가 있습니다.

다음은 제 컴퓨터에서 이 코드의 출력입니다:

 Character pointer pointing to 726409312, with value a   
 Character pointer pointing to 726409313, with value b   
 Character pointer pointing to 726409314, with value c   
 Character pointer pointing to 726409315, with value d   
 Integer pointer pointing to 726409296, with value 1   
 Integer pointer pointing to 726409300, with value 2   
 Integer pointer pointing to 726409304, with value 3   
 Integer pointer pointing to 726409308, with value 4

이제 여기서 주목할 점은 출력에 인쇄된 주소입니다. 문자 배열의 경우 포인터에 ‘1’을 더하면 바로 다음 주소로 증가하지만, 정수 배열의 경우 포인터에 ‘1’을 더하면 4개의 주소를 건너뜁니다. 왜 그런 걸까요?

그것은 모두 포인터의 유형에 달려 있습니다. 문자 포인터는 항상 문자가 차지하는 바이트 수만큼 점프하며, 이는 일반적으로 1입니다. 마찬가지로, 정수에 대한 포인터는 일반적으로 1만큼 증가할 때 4바이트를 점프합니다. 따라서 이것은 위 출력에서 문자와 정수 포인터 점프의 차이를 설명해야 합니다.

포인터 산술을 계속 진행하면서, 포인터는 특정 경우에 비교 표현식에서 사용할 수 있습니다. 예를 들어, 포인터 ‘ptr’이 배열 ‘arr’의 요소(크기가 ‘size’)를 가리키는지 확인하고 싶다면, 다음과 같이 비교할 수 있습니다:

if((ptr >= arr) && (ptr < (arr + size))) 

따라서 효과적으로 위 표현식은 포인터가 보유한 주소가 그 요소 중 하나인지 여부를 확인합니다.

또한, 동일한 배열의 요소를 가리키는 여러 포인터가 있는 경우, 다음 비교 연산자 ==, !=, <, 및 >=를 사용할 수 있습니다. 사실, 이러한 경우 포인터 뺄셈도 수행할 수 있습니다. 다음은 예제입니다:

#include   
  
int main()  
{  
    char arr[]= "Welcome to HowtoForge";  
   
    char *ptr = arr;  
    char *p = arr;  
   
    while(*p != '\0')  
   {  
      p++;  
   }  
   
   printf("\n Length of the string is %d", (p - ptr));  
   
   return 0;  
}

따라서 이 프로그램에서는 하나의 포인터가 배열의 첫 번째 요소를 가리키도록 하고, 두 번째 포인터는 마지막 요소(상수 문자열에서 ‘\0’인)를 가리킬 때까지 계속 증가하도록 했습니다.

그런 다음, 여기서 문자를 다루고 있으므로(각각 1바이트를 차지함), 첫 번째 포인터가 가리키는 주소에서 두 번째 포인터가 가리키는 주소를 빼면 문자 수를 찾을 수 있으며, 이는 문자열의 정확한 길이입니다.

참고: 포인터에 대한 덧셈, 곱셈, 나눗셈 등의 연산은 유효하지 않다는 점을 기억하세요. 또한, 지금까지 나열한 허용 가능한 연산은 포인터가 동일한 유형이고 동일한 배열의 요소를 가리킬 때만 유효합니다.

결론

이전 튜토리얼에서 기본 포인터 개념을 논의한 후, 여기에서는 포인터 주소 산술에 대해 논의하여 포인터 개념을 확장했습니다. 여기서 논의한 내용을 프로그램 형태로 귀하의 컴퓨터에서 연습해 보시기를 권장합니다. 의문이나 질문이 있는 경우 아래에 댓글을 남겨 주시기 바랍니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.