변수의 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; } |
'C언어' 카테고리의 다른 글
심화 C 언어 6 (포인터 3 - 메모리 동적할당 / 배열) (0) | 2021.08.03 |
---|---|
심화 C 언어 5 (포인터 2 - 포인터를 쓰는 이유) (0) | 2021.08.01 |
심화 C 언어 3 (문자열 - 문자의 '배열') (0) | 2021.07.30 |
심화 C 언어 2 (각종 변수형 - 모든 코딩에서 찾아볼 수 있는 '기본 자료형') (0) | 2021.07.27 |
c언어 6 (헤더파일 / 소스파일) (0) | 2021.07.26 |