<서론>
C언어의 포인터에 대한 이야기를 해보려고 합니다.
나를 위한, 초보자들을 위한 글입니다.
컴퓨터의 기억공간 = 메모리에 일정한 크기 단위로 번지를 붙여서 관리합니다.
이렇게 메모리의 한 공간에 붙은 번지를 주소라고 합니다.
포인터는 특별한 변수인데요, 변수의 주소를 알아내어 저장할 수 있습니다.
프로그램에서 다루는 대부분의 변수는 RAM(메모리)이라는 곳에 만들어 집니다.
메모리의 크기는 바이트(byte)단위로 나타냅니다.
바이트는 1비트(0 or 1)가 8개 모인 것이라 생각할 수 있습니다.
11111111 or 0000000 ....
한 자리당 1 or 0이 표현가능하므로 2의 8승 128개의 신호를 표시할 수 있습니다.
메모리를 효율적으로 관리하기 위해 메모리를 바이트 단위로 째갠 뒤 각 단위마다 번지를 붙이는 방식을 사용합니다. 이 번지를 다른 말로 주소 or address 라고 부르기도 합니다.
<본론>
int num; // int형 변수 num 선언
위와 같이 변수 num을 int형으로 선언하면 메모리에 4바이트 크기의 공간을 차지하게 됩니다.
why? 4바이트? int 형은 4바이트의 형식을 가집니다. (아래 표 참고)
변수가 메모리 안에 차지하는 공간을 기억공간(memory space)라고 부릅니다.
기억 공간의 크기는 컴퓨터 환경이나 운영체제 또는 컴파일러에 따라 달라집니다.
변수의 주소를 알아낼 때는 주소 연산자 &(앰퍼샌드ampersand)를 변수 이름 앞에 붙여서 사용합니다.
- #include <iostream>
- using namespace std;
- int main() {
- // your code goes here
- int integer;
- float flt;
- double dbl;
- cout << "변수 integer의 주소 " << &integer << endl;
- cout << "변수 flt의 주소 " << &flt << endl;
- cout << "변수 dbl의 주소 " << &dbl << endl;
- return 0;
- }
output
변수 integer의 주소 0xbfd4b4c0
변수 flt의 주소 0xbfd4b4c4
변수 dbl의 주소 0xbfd4b4c8
예제를 실행한 결과 16진수로 출력되는 변수들의 주소를 볼 수 있습니다.
주소를 잘 보면 4바이트 씩 증가하는 것을 볼 수 있습니다.
int형, float형 4바이트
double형 8바이트
★ 포인터(pointer)
이렇게 알아낸 주소를 저장하는 특별한 변수가 포인터 입니다.
포인터 연산자 *를 붙여서 선언할 수 있습니다.
int *ptr;
int* ptr;
int *p, *r, *h;
모두 가능합니다.
except int* p, r, h; // p변수만 포인터 선언됨
포인터를 선언할 때에 주의 점은 포인터의 자료형과 변수의 자료형이 일치해야 한다는 것입니다. 예를들어
int num;
int *iPtr; // int형에 맞춰서 선언
<포인터를 이용해서 변수의 주소를 저장하는 예제>
#include <iostream> using namespace std; int main() { int num; int *iPtr; iPtr = # cout << "변수 num의 주소 " << iPtr << endl; return 0; }
output
변수 num의 주소 0xbfa79fac
★ 포인터로 변수의 값을 알아보자
포인터 이름 앞에 *를 붙여주면 포인터에 담긴 주소가 나타내는 기억 공간에 있는 값을 알 수 있습니다.
<포인터가 담고 있는 주소에 저장된 값을 알아내는 예제>
- #include <iostream>
- using namespace std;
-
- int main() {
- // your code goes here
- int num = 10;
- int *ptr;
- ptr = #
-
- cout << "변수 num의 주소 " << ptr << endl;
- cout << "변수 num의 값 " << num << endl;
- out << "포인터 ptr이 가리키는 주소에 있는 값 " << *ptr << endl;
- // ptr 앞에 *를 붙여서 포인터가 담고 있는 주소의 값을 알수 있습니다.
- return 0;
- }
output
변수 num의 주소 0xbfc3c73c 변수 num의 값 10 포인터 ptr이 가리키는 주소에 있는 값 10</pre>
output을 보면 포인터 ptr이 num가 가지고 있는 값을 나타내고 있습니다.
그럼 포인터가 가지고 있는 값을 변경해보도록 하겠습니다.
- #include <iostream>
- using namespace std;
- int main() {
- int num = 10;
- int *ptr;
- cout << "변수 num의 현재 값 " << num << endl;
- ptr = #
- *ptr = 20;
- cout << "*ptr에 20을 넣었습니다." << endl;
- cout << "변수 num의 값 " << num << endl;
- return 0;
- }
output
변수 num의 현재 값 10 *ptr에 20을 넣었습니다. 변수 num의 값 20
포인터 ptr앞에 *를 붙인 *ptr은 변수 num의 주소에 있는 값이 됩니다. 새로운 값을 넣었으니 변경이 됩니다. 10->20
여기까지 포인터에 대한 기본적인 지식이었습니다. 감사합니다.
'IT > C Language' 카테고리의 다른 글
C언어에서 알아야 할 것들 (0) | 2014.12.19 |
---|---|
소수의 합 구하기 (0) | 2014.12.19 |
Visual Studio Express 2013 콘솔창이 안뜨고 디버깅 완료될 때 콘솔창 띄우기 (0) | 2014.12.19 |
자료형 (0) | 2014.12.19 |
인치의 길이를 센티미너로 계산하여 출력하는 프로그램 (0) | 2014.12.19 |