웹사이트 검색

Linux C 프로그래밍 자습서 20부 - 포인터 주소 산술


이 페이지에서

  1. C의 포인터 주소 산술
  2. 결론

진행 중인 이 C 프로그래밍 시리즈의 이전 자습서에서 포인터에 대해 자세히 설명했습니다. 그 토론을 확장하여 포인터와 관련된 몇 가지 더 논의할 가치가 있는 개념이 있습니다. 더 이상 고민하지 않고 시작하겠습니다.

C의 포인터 주소 산술

첫째, 포인터를 다룰 때 주소 산술에 집중하자. 이전 자습서에서 설명한 것처럼 배열을 가리키는 포인터가 있는 경우(시작 부분이라고 가정) 해당 배열의 요소에 매우 쉽게 액세스할 수 있습니다. 예를 들면 다음과 같습니다.

#include <stdio.h>

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<sizeof(arr); i++)
{
printf("\n Character pointer pointing to %u, with value %c", ptr, *ptr);
ptr++;
}

for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
{
printf("\n Integer pointer pointing to %u, with value %d", p, *p);
p++;
}

return 0;
}

따라서 이 코드에는 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(크기 크기)의 요소를 가리키는지 여부를 확인하려면 다음과 같은 방법으로 비교할 수 있습니다.

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

따라서 위의 식은 포인터가 보유한 주소가 해당 요소 중 하나인지 여부를 확인합니다.

또한 동일한 배열의 요소를 가리키는 포인터가 여러 개인 경우 ==, !=, < 및 >= 비교 연산자를 사용할 수 있습니다. 실제로 이러한 경우 포인터 빼기를 수행할 수도 있습니다. 예를 들면 다음과 같습니다.

#include <stdio.h>

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;
}

따라서 이 프로그램에서 우리는 하나의 포인터가 배열의 첫 번째 요소를 가리키는지 확인하고 두 번째 포인터는 마지막 요소(상수 문자열에 있음)를 가리킬 때까지 계속 증가합니다.

그런 다음 여기에서 문자(각각 1바이트를 차지함)를 다루고 있다는 사실을 감안할 때 첫 번째 포인터가 가리키는 주소에서 두 번째 포인터가 가리키는 주소를 빼면 문자 수를 찾을 수 있습니다. 문자열의 길이.

참고: 더하기, 곱하기, 나누기 등과 같은 연산은 포인터와 관련하여 유효하지 않습니다. 또한 지금까지 나열한 허용 가능한 작업의 종류는 포인터가 동일한 유형이고 동일한 배열의 요소를 가리키는 경우에만 유효합니다.

결론

이전 자습서에서 기본 포인터 개념을 논의한 후 여기에서 포인터 주소 산술을 논의하여 포인터 개념을 구축했습니다. 여기에서 논의한 내용을 컴퓨터에서 프로그램 형태로 연습하는 것이 좋습니다. 의심스럽거나 질문이 있는 경우 주저하지 말고 아래에 의견을 남겨주십시오.