본문 바로가기

C언어

심화 C 언어 4 (포인터 1 - 기초)

 변수의 3요소

  1. 변수의 이름 : (프로그래머가 필요로 하는 이름)
  2. 변수의 주소 : (컴퓨터가 필요로 하는 이름)
  3. 변수의 값 : 변수가 담고 있는 값

이름과 주소

: 프로그래머는 '변수의 이름'을 이용해 변수를 구분하지만

컴퓨터 (기계)는 '변수의 주소'를 이용해 변수를 구분한다

즉, 변수의 주소는 컴퓨터에게 있어서의 변수명

 

포인터

C/C++ 에서는 이 컴퓨터 (기계)에게 적용되는 변수명인 '주소' 라는 것을

직접적으로 조작할 수 있는 포인터 라는 '방법'을 제공하는데

주소를 조작하는 것을 '포인터를 이용한다'라고 한다.

 

포인터 데이터 타입

: 모든 기본형 데이터 타입 포함 사용자 정의 데이터 타입

바로 오른쪽에 *(애스터리스크)를 붙여주게 되면

해당 데이터타입의 포인터 타입이 만들어지게 된다

int*myPointer

 

포인터에는 주소값 (즉, 기계에게 유효한 변수명)이 이 변수의 이름에 할당이 되는 것

이 지정된 주소값을 프로그래머가 가져와서 조작하려면??

변수의 값을 가져올 때는 그냥 변수에 이름을 쓰면 된다

 

주소값을 가져오는 방법

모든 변수(기본형, 사용자 정의 데이터 포함)의 변수명 바로 왼쪽에 & (앰퍼샌드)를 붙여주게 되면 해당 변수의 주소값이 나오게 된다

 

int myPointer = 0;

&myPointer; // 주소값

 

** 모든 변수에는 각각 맞는 포인터 타입이 있고

이 포인터 타입은 독립적으로 존재할 수 없으며 

다른 변수의 주소값을 즉 참조, 그 녀석을 간접적으로 조작할 수 있는 방법을 제공해주는데 

간접적으로 조작하기 위해서는 그 변수의 주소값을 얻어 와야 되고

얻어온 그 주소값을 이용해서

그 변수를 간접 조작하기 위해서는

해당 포인터 변수의 이름 앞에 *을 붙이면 된다 ** 

 

#include "prc.hpp"


int main(){
    
    int myValue = 100;
    int*myValueAddress; // 포인터 데이터타입
    
    myValueAddress = &myValue;  

    /* myValue 라는 변수에 & 기호에 의해서 주소 (즉, 컴퓨터가 기계에게 유효한 변수명)이 나오게 되고 그것이 주소임
      그 주소가 myValueAddress 라는 변수로 들어가게 된다
      즉 myValueAddress 가 주소값을 가지게 된다.

     이 주소값을 이용해 원본 변수에 접근하여 원본 변수의 값을 조작하는 것 역시 가능*/
    
    //myValue = 200;
    //myValue 가 200이 나올 것인데 여기에서 myValueAddress라는 변수를 활용해 myValue의 값을 바꿀 수 있다
    
    *myValueAddress = 200;

    // myValueAddress 앞에 * 을 붙이게 되면
       실제로 이 myValueAddress 안에 저장되어 있는 기계에게 유효한 변수명을 활용해
       그 변수명의 주소(myValue의 주소)를 따라가서 그 변수명의 주소가 있는 곳에 값을 조작할수 있다,
       주소를 따라가라는게 포인터 변수 앞에 *붙이기임

    // *myValueAddress = 200; 을 하면 이 myValueAddress가 가리키고 있는 곳은 myValue의 주소다,
       *을 붙이면 그 주소를 따라가서 그 주소에 있는 값을 이라는 의미 그 값을 200으로 할당하라임!!!!!!!

    
    printf("myValue : %d", myValue);
    
    
    return 0;
}

위 코드 정리

  • myValue 라는 변수 앞에 &을 붙이면 myValue 의 주소가 나옴
  • myValueAddress = &myValue;  라고 써서 myValue 주소값이 myValueAddress 라는 변수에 들어가게 만듦
  • 이 myValueAddress에 값을 200을 할당하려면?
  • myValueAddress 앞에 * 을 붙여 안에 저장된 &myValue의 주소값으로 따라가게 만들어야함
  • *myValueAddress = 200; 이라고 쓰면 된다
  • 그러면 *myValueAddress가 myValue 의 주소값에 따라가서 주소값을 200으로 만듦

 

연습 프로그래밍

사용자로부터 입력을 받아

두 수를 덧셈하는 프로그램을 만드세요

덧셈을 할 때 원본 변수를 만들고

포인터 데이터 타입을 이용해 숫자를 조작하세요

 

- 포인터를 안쓰고 코드 짜는 경우

헤더파일

#define _CRT_SECURE_NO_WARNINGS


#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>


int getInt();
// 사용자로부터 값을 받아오는 함수
#include "prc.hpp"


int main(){
    int v1 = getInt();
    int v2 = getInt();
    // 값을 두 개를 받아옴
    
    int result = v1 + v2;
    
    printf("%d + %d = %d", v1, v2, result);
    
    return 0;
}

int getInt() {
    int input;
    printf("숫자를 입력해 주세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%d", &input);
    
    return input;
}

- 포인터 변수 타입을 이용해 풀어보기 ( 헤더 파일은 동일 )

#include "prc.hpp"


int main(){
    int v1;
    int v2;
    // 값을 선언만
    int result;
    
    int* pv1 = &v1;
    int* pv2 = &v2;
    int* presult = &result;
    // int포인터 데이터 타입들이 선언된 변수를 각각 참조하고 있는 모습
    // 앞에 & 기호를 이용해 뒤에 들어갈 주소값만 넣어주면 자동적으로 참조 변수가 된다
    // 참조 변수의 실제 값을 이용해 주기 위해서는 앞에 *를 붙여주기만 하면 된다
    // 앞에 *을 붙인채로 원래 사용했던 것과 똑같이 사용해 주기만 하면 됨
    
    *pv1 = getInt();
    *pv2 = getInt();
    *presult = *pv1 + *pv2;
    
    printf("%d + %d = %d", v1, v2, result);
    
    return 0;
}

int getInt() {
    int input;
    printf("숫자를 입력해 주세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%d", &input);
    
    return input;
}

과제형 연습 프로그래밍

사용자로부터 입력을 받아

두 수의 사칙연산을 하는 프로그램을 만드세요

사칙연산을 할 때 원본 변수를 만들고

포인터 데이터 타입을 이용해 숫자를 조작하세요

#include "prc.hpp"


int main(){
    int v1;
    int v2;
    char opr;
    int result = 0;
    
    int* pv1 = &v1;
    int* pv2 = &v2;
    char* popr = &opr;
    int* presult = &result;
    
    *pv1 = getInt();
    *pv2 = getInt();
    *popr = getChar();
    
    if (*popr == '+'){
    *presult = *pv1 + *pv2;
    }
    else if (*popr == '-'){
        *presult = *pv1 - *pv2;
    }
    else if (*popr == '*'){
        *presult = *pv1 * *pv2;
    }
    else if (*popr == '/'){
        *presult = *pv1 / *pv2;
    }
    
    printf("%d %c %d = %d", v1,opr, v2, result);
    
    return 0;
}


int getInt() {
    int input;
    printf("숫자를 입력해 주세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%d", &input);
    
    return input;
}


char getChar() {
    char input2;
    printf("연산자를 입력해 주세요 : ");
    fseek(stdin, 0, SEEK_END);
    scanf("%c", &input2);
    
    return input2;
}