본문 바로가기

Computer Engineering

[C] 0x0F 포인터(Pointer)

From Evernote:

[C] 0x0F 포인터(Pointer)

오늘은 C언어의 꽃이라고 할 수 있는 포인터에 대해서 알아보도록 하자
C언어가 H/W 제어권을 움직일 수 있는 강력한 언어가 된 이유라고 할 수 있다.

포인터는 다른 말로 메모리의 주소라고 할 수 있다.
C 소스 코드에서는 '주소를 저장하는 변수'라고도 할 수 있다.

아래의 예제 코드를 살펴보자
int main()
{
int a = 7;
double d = 3.14;
char c = 'a';

return 0;
}
 

일반 변수와 다르게 포인터 변수는
int*p ( = int * p = int* p = int *p ) 는 모두 동일한 변수선언이다. 즉, 공백을 무시하기 때문에 어떻게 선언을 하든 상관이 없는 것이다.

int형 a나 double형 d는 각각 4byte, 8byte의 공간을 차지한다. 하지만 '주소'값을 사용할 때에는 하나만 사용한다.바로 각각의 자료형의 시작주소이다.(이것은 컴퓨터의 기본적인 처리방식이라고 할 수 있다.) 그 결과 자료형(DataType)과 상관없이 포인터 변수의 크기는 4byte(= 32bit)가 된다.
=> 우리가 현재 실습하는 환경이 대부분 32bit 이기 때문에 컴퓨터의 기본처리 단위를 따라서 4byte(= 32bit)가 된 것이다.

위에서 이야기 했듯이 포인터가 저장하는 것은 '메모리의 주소'
->가리키다 -> 변수가 존재하는 '위치값'
=> 기억하고 있는 공간을 가리키는 것이다.

그렇다면 왜 포인터를 사용할까?(= 왜 기억하고 있는 공간을 가리키는 것일까?)
=> 그 이유는 바로 Data가 있는 공간을 기억해서 Data가 필요할 때 사용하기 위해서이다.

여기서 헷갈리는 분들을 위해서 C언어에서 '*'의 의미를 잠깐 살펴보자.
 

= '*'의 의미 =
1. 곱하기 : 2 * 3
2. 포인터 : int* ap (자료형* 변수명)
3. 참조 : *ap (*변수명)

int* ap = &a;
// 이렇게 변수가 선언되어 있는 경우 *ap == a 이다.
*ap : ap가 가리키고 있는 공간을 찾아간다. (참조값이라고 한다. 참조값은 주소가 아니라 일반값이다.)

주소를 처리하는 방식과 일반 data를 처리하는 방식은 다르다.
int a = 5;
int* p = &a; //여기에서 int* 이 자체가 자료형이다.
=> a == *p , &a == p 이렇게 되는 것이다. 여기에서 *p는 참조값이 되어서 일반값과 같은값이 되는 것이다.

= Data를 전달하는 방식 =
1. Call by Value
: 값에 의한 전달, 복사본을 생성한다.
ex) printf

2. Call by Address
: 주소에 의한 전달, 전달인자의 값을 변경한다.
ex) scanf
=> 입력된 값에따라 변경될 수 있으므로 Call by Address 방식을 취하는 것이다.

(여기에서 a의 주소값은 0x100이라고 하자.)
int a = 5;
int* p = &a;

p = 0x100
*p = 5
&*p = 0x100
*&*p = 5
.
.
=> 이와 같이 주소값과 변수값이 되는데 &와 *는 서로 상쇄되는 것을 확인할 수 있다.

Posted via email from zzackzack2's Space

'Computer Engineering' 카테고리의 다른 글

[c] 0x0D 함수(Function)  (0) 2012.01.25
KLDPWiki: Emacs Change Fonts (Emacs 글꼴 바꾸기)  (0) 2012.01.25
[C] 0x07 조건문(Switch)  (0) 2012.01.13
[C] 0x06 조건문(if)  (0) 2012.01.12
[C] 0x05 연산자(Operator)  (0) 2012.01.11