Skip to main content

Command Palette

Search for a command to run...

포인터 연산

Published
2 min readView as Markdown

TYPE형 포인터를 대상으로 n의 크기만큼 값을 증가 및 감소 시, n * sizeof(TYPE)의 크기 만큼 주소 값이 증가 및 감소

#include <stdio.h>

int main(void)
{
    int arr[3]={11, 22 ,33};
    int * ptr=arr;      // int * ptr=&arr[0]과 같은 문장
    printf("%d %d %d \n", *ptr, *(ptr+1), *(ptr+2));

    printf("%d ", *ptr); ptr++;     // printf 함수 호출 후, ptr++ 실행
    printf("%d ", *ptr); ptr++;
    printf("%d ", *ptr); ptr--;
    printf("%d ", *ptr); ptr--;
    printf("%d ", *ptr); printf("\n");
    return 0;
}

/* 결과
11 22 33 
11 22 33 22 11 
*/

중요한 결론! arr[i] == *(arr+i)


상수 형태의 문자열을 가리키는 포인터

두 가지 형태의 문자열 표현

⁠char str1[ ] = "My String";  // 배열의 길이는 자동으로 계산된다.

  • 이는 배열을 기반으로 하는 ‘변수 형태의 문자열'

⁠char * str2 = "Your String";

  • 이렇게 선언을 하면 메모리 공간에 문자열이 저장되고, 문자열의 첫 번째 문자 Y의 주소 값이 반환

  • 반환 값이 포인터 변수 str2에 저장

배열 이름 str1은 계속해서 문자 M이 저장된 위치를 가리키는 상태이어야 하지만 포인터 변수 str2는 다른 위치를 가리킬 수 있습니다.

#include <stdio.h>

int main(void)
{
    char str1[]="My String";        // 변수 형태의 문자열
    char * str2="Your String";      // 상수 형태의 문자열
    printf("%s %s\n", str1, str2);

    str2="Our String";      // 가리키는 대상 변경
    printf("%s %s\n", str1, str2);

    str1[0]='X';        // 문자열 변경 성공!
    // str2[0]='X'; -> 실행 시 오류로 프로그램 종료 됌.        // 문자열 변경 실패!
    printf("%s %s\n", str1, str2);
    return 0;
}

/* 결과 
My String Your String
My String Our String
Xy String Our String */

포인터 변수로 이뤄진 배열: 포인터 배열

포인터 배열의 이해

  • 포인터 배열: 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열

⁠int * arr1[20];  // 길이가 20인 int형 포인터 배열 arr1

double * arr2[30];  // 길이가 30인 double형 포인터 배열 arr2

#include <stdio.h>

int main(void)
{
    int num1=10, num2=20, num3=30;
    int * arr[3]={&num1, &num2, &num3};

    printf("%d\n", *arr[0]);
    printf("%d\n", *arr[1]);
    printf("%d\n", *arr[2]);
    return 0;
}

/* 결과 
10
20
30 */

문자열을 저장하는 포인터 배열

⁠char * strArr[3];

#include <stdio.h>

int main(void)
{
    char * strArr[3]={"Simple", "String", "Array"};
    printf("%s\n", strArr[0]);
    printf("%s\n", strArr[1]);
    printf("%s\n", strArr[2]);
    return 0;
}

/* 결과
Simple
String
Array */

More from this blog

선행처리기와 매크로

선행처리는 컴파일 이전의 처리를 의미 선행처리는 선행처리기에 의해서, 컴파일은 컴파일러에 의해서, 링크는 링커에 의해서 진행 소스파일 → 선행처리기 → 선행처리 거친 소스파일 → 컴파일러 → 오브젝트 파일 → 링커 → 실행파일 컴파일 과정을 거치게 되면 바이너리 데이터로 이루어진 오브젝트 파일이 생성 선행처리기가 하는 일 삽입해 놓은 선행처리 명령문대로 소스코드의 일부를 수정 여기서 수정이란, 단순 치환의 형태 /* 간단한 선행처리 명령문 */...

Oct 10, 20246 min read

C 언어의 메모리 구조

프로그램을 실행하면 해당 프로그램의 실행을 위한 메모리 공간이 운영체제에 의해서 미리 마련 그리고 바로 이 메모리 공간 내에서 변수가 선언되고, 문자열이 선언되는 것 메모리의 구성 프로그램 실행 시 운영체제에 의해서 마련되는 메모리의 구조는 네 개의 영역으로 구분 코드 영역 / 데이터 영역 / 힙 영역 / 스택 영역 메모리 공간을 나눠놓은 이유는 유사한 성향의 데이터를 묶어서 저장을 하면, 관리가 용이해지고 메모리의 접근속도가 향상 메모리 영역...

Oct 9, 20246 min read

파일과 스트림(Stream), 그리고 기본적인 파일의 입출력

저기 저 파일에 저장되어 있는 데이터를 읽고 싶어요. 프로그램 상에서 파일에 저장되어 있는 데이터를 참조하길 원한다고(읽기 원한다고) 가정했을 때, 우리가 구현한 프로그램과 참조할 데이터가 저장되어 있는 파일 사이에 데이터가 이동할 수 있는 다리를 놓는 일을 먼저 해야 한다. 이러한 데이터 이동의 경로가 되는 다리를 가리켜 ‘스트림(stream)’이라 함. 스트림이라는 것은 운영체제에 의해서 형성되는 소프트웨어적인 상태를 의미하는 것 따라서, ...

Oct 8, 20249 min read

JinGood

31 posts