ewok 2023. 4. 6. 12:28

포인터 변수

주소참조 : 메모리 영역에는 주소가 부여되어 있다.

포인터 변수 : (포인터를 사용하기 위해) 포인터 값(주소)을 다룰 수 있는 변수

 

주소를 다루는 방법

  • & - 주소 연산자
  • * - 포인터 연산자, 간접 연산자

 

포인터

  • 특정한 데이터가 저장된 주소값(시작 주소)을 저장하는 변수
  • 하나의 주소값은 1바이트 크기의 메모릭 공간을 표현함

 

포인터 변수 선언문

형식 : 자료형* 포인터변수명;

{
    int *p1;
    int* p1;
}

위 두 표현은 같은 표현으로 포인터형이다.

 

 

포인터변수 선언과 대입

기본자료형 변수

int num;
num = 10;

int형에는 정수인 상수가 들어간다.

 

포인터자료형 변수

int* p;
p = #

int*형에는 정수변수의 주소가 들어간다. &num에서 &은 주소 연산자이다. 따라서 &num은 num변수의 주소를 의미한다. 그래서 p에는 num의 주소가 들어간다.

 

이를 통해 p는 num의 주소를 가리킬 수 있게 된다. 10에 접근하는 두 가지 방법이 생긴 것이다. num이라는 변수명을 통한 접근과 p에 담긴 주소를 통한 접근이다.

 

 

포인터 변수와 연산자

&(주소연산자)

모든 변수에 대한 주소값을 구하는 연산자

 

*(포인터연산자, 간접연산자)

포인터 변수의 자료(내용)를 구하는 연산자

선언문인 int* p; 에 있는 *는 연산자가 아니다.

 

#include <stdio.h>
void main()
{
    int num;
    int* p1;
    num = 100;
    p1 = &num;		// num의 주소를 p1에 대입
    printf("일반변수 접근 : %d\n", num);		// 100
    printf("포인터변수 접근 : %d\n", *p1);	// 100
}

 

#include <stdio.h>
void main()
{
    float num;
    float* p1;
    num = 3.14;
    p1 = &num;
    printf("일반변수 접근 : %f\n", num);		// 3.14
    printf("포인터변수 접근 : %f\n", *p1);	// 3.14
}

 

 

포인터 변수와 배열

#include <stdio.h>
void main()
{
    int i;
    int A[] = {10,20,30,40,50};
    int* p;
    p = A;	// p = &A[0];
    
    for (i = 0; i < 5; i++)
    {
        printf("%5d", *(p+i));		// printf("%5d", A[i]);
    }
}

 

포인터 변수와 연산

#include <stdio.h>
void main()
{
    int NUM = 98;    
    int* ptr;    
    ptr = &NUM;
    --------------------- 그림1
    NUM = NUM + 1;		// NUM = 98 + 1;
    printf("%d\n, NUM");	// 99
    --------------------- 그림2
    *ptr = *ptr + 1;		// *ptr = 99 + 1; / (*ptr)++;
    printf("%d\n", *ptr);	// 100
    --------------------- 그림3
}

ptr은 200번지를 의미하며, *ptr은 200번지의 내용을 의미한다.