주소 값의 저장을 목적으로 선언되는 포인터 변수

int main(void)
{
    char ch1='A', ch2='Q';
    int num=7;
}
/* 총 6바이트(1바이트 + 1바이트 + 4바이트)가 메모리 공간에 할당 
   1바이트의 메모리 공간을 단위로 하나의 주소 값이 할당되며, 주소 값도 1씩 증가
   C언어에서는 시작번지만을 가지고 위치를 표현 */

포인터 변수란 메모리의 주소 값을 저장하기 위한 변수

포인터 변수와 & 연산자

“정수 7이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언 → pnum에 변수 num의 주소 값 저장"

int main(void)
{
    int num=7;
    int * pnum;    // 포인터 변수 pnum의 선언
    pnum = #   // num의 주소 값을 포인터 변수 pnum에 저장
}
/* &연산자는 '오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자' 
   pnum에는 변수 num의 시작번지 주소 값이 저장
   -> 포인터 변수 pnum이 int형 변수 num을 가리킨다. 
   32비트 시스템 포인터 변수 -> 4바이트
   64비트 시스템 포인터 변수 -> 8바이트 */

포인터 변수 선언

  • 포인터 변수는 가리키고자 하는 변수의 자료형에 따라서 선언하는 방법이 달라짐, 사실 주소 값은 동일한 시스템에서 그 크기가 동일하며 모두 정수의 배열들 띔.

⁠type * ptr;  // type형 변수의 주소 값을 저장하는 포인터 변수 ptr의 선언⁠


포인터와 관련있는 연산자: & 연산자, * 연산자⁠

변수의 주소 값을 반환하는 & 연산자

int main(void)
{
    int num = 5;
    int * pnum = &num  // num의 주소 값을 반환해서 포인터 변수 pnum을 초기화
}

/* & 연산자의 피연산자는 변수이여야 하며, 상수는 피연산자가 될 수 없다 */
 
int main(void)
{
    int num1 = 5;
    double * pnum1 = &num1;  // 일치하지 않음!

    double num2 = 5;
    int * pnum2 = &num2;  // 일치하지 않음!
}

포인터가 가리키는 메모리를 참조하는 * 연산자

int main(void)
{
    int num=10;
    int * pnum=#  // 포인터 변수 pnum이 변수 num을 가리키게 하는 문장
    *pnum=20;    // pnum이 가리키는 변수에 20을 저장하라!
    printf("%d", *pnum);    // pnum이 가리키는 변수를 부호 있는 정수로 출력하라!
}

/* *pnum이 의미하는 바: 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 접근 */
 
#include <stdio.h>

int main(void)
{
    int num1=100, num2=100;
    int * pnum;

    pnum=&num1;     // 포인터 pnum이 num1을 가리킴
    (*pnum)+=30;        // num1+=30; 과 동일

    pnum=&num2;     // 포인터 pnum이 num2를 가리킴
    (*pnum)-=30;        // num2-=30; 과 동일

    printf("num1: %d, num2: %d\n", num1, num2);
    return 0;
}

/* 결과 
num1: 130, num2: 70 */

다양한 ‘포인터 형'이 존재하는 이유

포인터 기반의 메모리 접근 기준을 마련하기 위해

잘못된 포인터의 사용과 null 포인터

  • 포인터 변수를 선언만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화 → 어디를 가리킬 지 모르게 됌.

포인터 변수는 어떤 값으로 초기화를 시켜야 할까

int main(void)
{
    int * ptr1=0;
    int * ptr2=NULL;  // NULL은 사실상 0을 의미
}

/* ptr1을 초기화하는 값 0을 가리캬 'Null 포인터'라 함.
   "아무데도 가리키지 않는다!"를 의미함 */

'C' 카테고리의 다른 글

배열의 이해와 배열의 선언 및 초기화 방법  (0) 2025.03.12
변수의 존재기간과 접근범위  (0) 2025.03.12
조건에 따른 흐름의 분기  (0) 2025.03.12
반복 실행을 명령하는 반복문  (0) 2025.03.12
printf, scanf  (3) 2025.03.12

+ Recent posts