Notice
Recent Posts
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

One Step Two Step

[C언어 기초] C언어의 꽃, 포인터(Pointer) 완벽 이해하기 본문

복습/C언어

[C언어 기초] C언어의 꽃, 포인터(Pointer) 완벽 이해하기

DEVILOW 2026. 3. 4. 23:06
반응형
  • 포인터 (Pointer)
    • 메모리의 주소를 저장하는 변수
    • 포인터 선언  ☞  자료형 * 포인터이름;
    • 초기화 필수
      char c = 'A';		// 문자형 변수
      float f = 36.5;		// 실수형 변수
      double d = 3.141592;// 실수형 변수
      
      char *pc = &c;		// 문자를 가리키는 포인터 
      float *pf = %f;		// 실수를 가리키는 포인터
      double *pd = %d;	// 실수를 가리키는 포인터
       
    • " * " 간접 참조 연산자
      • 포인터가 가리키는 값을 가져오는 연산자
    •  " & " 주소 연산자
      • 변수의 메모리 주소값을 알아내는 연산자
        int num = 10;      // 일반 변수
        int *p;            // 포인터 변수 선언 
        
        p = #          // num의 주소를 p에 저장
        
        printf("num의 값: %d\n", num);
        printf("num의 주소: %p\n", &num);
        printf("포인터 p가 가진 주소: %p\n", p);
        printf("포인터 p가 가리키는 곳의 값: %d\n", *p); // '간접 참조'
        
        /*
        num의 값: 10
        num의 주소: 0000008990AFFAF4	
        포인터 p가 가진 주소: 0000008990AFFAF4
        포인터 p가 가리키는 곳의 값: 10
        */



  • 포인터 연산
    • 증가(++), 감소(--), 덧셈(+), 뺄셈(-)
    • 증가 연산의 경우 증가되는 포인터가 가리키는 객체의 크기
      #include <stdio.h>
      
      int main(void) {
      	char *pc;
      	int *pi;
      	double *pd;
      
      	pc = (char *)10000;
      	pi = (int *)10000;
      	pd = (double *)10000;
      	printf("증가 전 pc = %d, pi = %d, pd = %d\n", pc, pi, pd);
      
      	pc++;
      	pi++;
      	pd++;
      	printf("증가 후 pc = %d, pi = %d, pd = %d\n", pc, pi, pd);
      	printf("pc+2 = %d, pi+2 = %d, pd+2 = %d\n",pc+2,pi+2,pd+2);
      	return 0;
      }
      // 증가 전 pc = 10000, pi = 10000, pd = 10000
      // 증가 후 pc = 10001, pi = 10004, pd = 10008
      // pc+2 = 10003, pi+2 = 10012, pd+2 = 10024
    • * 연산자와 증감 연산자
      • *p++;  →  *(p++), p를 먼저 사용(역참조)한 뒤, 포인터 p를 1 증가 (주소값 증가)
      • (*p)++;  →  p가 가리키는 위치의 값을 증가
      • *++p;  →  *(++p), 포인터를 먼저 증가시킨 뒤, 그 위치를 역참조 (주소값 증가)
      • ++*p;  →  ++(*p), 현재 가리키는 값을 먼저 증가시키고 그 값을 사용

  • 포인터와 배열
    • 배열 이름 == 포인터, 포인터는 배열처럼 사용 O

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int arr[3] = { 10, 20, 30 };
    int* p;

    p = arr;
    printf("배열의 이름 arr의 값: %p\n", arr);
    printf("arr[0]=%d arr[1]=%d arr[2]=%d \n", arr[0], arr[1], arr[2]);

    printf("포인터 이용\n");
    printf("배열의 이름 arr의 값: %p\n", p);
    printf("p[0]=%d p[1]=%d p[2]=%d \n", p[0],p[1], p[2]);

    return 0;
}
/*
배열의 이름 arr의 값: 000000574D7AF728
arr[0]=10 arr[1]=20 arr[2]=30
포인터 이용
배열의 이름 arr의 값: 000000574D7AF728
p[0]=10 p[1]=20 p[2]=30
*/

  • 인수 전달 방법
    • 함수 호출 시 인수 전달 방법
      • 값에 의한 호출 (call by value)
        • 함수로 복사본 전달
        • 기본적인 방법
      • 참조에 의한 호출 (call by reference)
        • 함수로 원본 전달
        • 포인터
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void swap_value(int x, int y);
void swap_reference(int *px, int *py);

int main(void) {
    printf("Call by value\n");
    int a = 100, b = 200;
    printf("a=%d b=%d\n", a, b);
    swap_value(a, b);
    printf("a=%d b=%d\n\n", a, b);

    printf("Call by reference\n");
    printf("a=%d b=%d\n", a, b);
    swap_reference(&a, &b);
    printf("a=%d b=%d\n\n", a, b);
    return 0;
}

void  swap_value(int x, int y) {
    int tmp;
    printf("x=%d y=%d\n", x, y);

    tmp = x;
    x = y;
    y = tmp;

    printf("x=%d y=%d\n", x, y);
}
void swap_reference(int* px, int* py) {
    int tmp;
    printf("x=%d y=%d\n", *px, *py);
    tmp = *px;
    *px = *py;
    *py = tmp;
    printf("x=%d y=%d\n", *px, *py);
}
/*
Call by value 
a=100 b=200
x=100 y=200
x=200 y=100
a=100 b=200

Call by reference
a=100 b=200
x=100 y=200
x=200 y=100
a=200 b=100
*/

 

반응형