본문 바로가기

공대남자/프로그래밍

Pointer Skill Master - Level 1





아 이놈의 Pointer. 마스터 해보자.


1. Address

Memory의 위치를 알려준다. Mem 공간에 1 byte마다 붙여놓은 번호.
Mem 안에 data를 넣고 싶으면 어드레스로 접근한다.


2.주소형 변수

int a =10;
int *p;
p = &a;

a는 메모리 어느 공간을 a로 이름짓고 10을 넣음.
p는 주소형변수 선언. 주소형 변수에는 주소만 들어갈 수 있다.
&a는 a의 주소값을 얻어내어 p에 넣겠다.

해당 심볼에 &만 갖다붙이면 그에 대한 주소를 얻어낼 수 있다.
즉, int *p; p=&a; 라고 하면 a에 해당하는 4바이트 중 첫번째 바이트의 주소를 얻어내는 것.

*&a 와 a는 같은 표현. 이라는데 왜 같은 표현일까?

*p와 a는 같다. *p=100; 과 a=100;은 같은것.
주소이용/심볼이용의 차이.

주소형 변수를 이용해서 값을 할당하거나 추출하기 위해서는 *를 붙인다.

int a=10;
int *p = &a;
*p = 100;

정리하자면,

일반 변수 -> int a=10;
변수의 주소 -> &a
주소를 다시 일반변수로 -> *&a

즉, a == *&a



3. 포인터 변수

주소가 가리키는 곳의 값을 추출하기 위해서 주소에 *를 붙임.
*p
주소를 일반 변수로. *p에는 변수값이 들어있으며 *p == a. a의 주소는 p이며 p의 주소가 가리키는 값이 a의 값이다.
즉, p는 a의 주소이고 이 주소가 가리키는 값을 알려면 *를 붙여 *p로 쓰고 이 값은 a와 같게 되는것.

내가 써놓고도 뭔소린지 모르겠다.

이 예제가 잘 설명을 해주는군.



#include <stdio.h>

int main(void)
{
 int a = 100;  //일반 변수 a에 100을 할당.
 int b = 200;  //일반 변수 b에 200을 할당.
 int* p;  //p라는 포인터변수 선언.
 printf("a의 주소는 %p, b의 주소는 %p\n", &a, &b);   //&a, &b를 통해 a와 b의 주소를 출력.
 printf("a의 값은 %d, b의 값은 %d\n", a, b);   // 일반 변수 a,b의 값을 출력.

 p = &a;  //a의 주소를 p에 할당.
 printf("p의 주소는 %p\n", p); //p에 할당된 a의 주소를 출력.
 *p = 1000;  // 일반 변수화된 p에 1000이라는 값을 할당. *p는 곧 a에 넣는 것과 같다.
 printf("*p는 %d\n", *p);  //*p에 있는 값을 출력. (1000이 출력되겠죠?)

 p = &b;  //역시 b의 주소를 p에 할당.
 printf("p의 주소는 %p\n", p);  //p에 할당된 b의 주소를 출력.
 *p = 2000;  //일반 변수화된 p에 2000이라는 값을 할당. *p는 곧 b에 넣는 것과 같다.
 printf("*p는 %d\n", *p);  //*p에 있는 값을 출력. 이제는 b의 값이 출력되겠죠?
 
 return 0;
}


//*p에 대한 고찰.
//일반변수화되다 == p 주소가 가리키는 메모리공간 안을 가리키다. == a

 

//출처:소설같은C. 주석:내가다했다




코드는 매우 쉽구나. 솔까 위에꺼 다 이해하면 코드는 걍 넘어가도 됨.



********* 축하드립니다. Pointer 스킬 랭크가 1 상승하였습니다. ***********


 

'공대남자 > 프로그래밍' 카테고리의 다른 글

안드로이드 프로그래밍 - 1. 개발환경 구축  (0) 2010.01.18
NXT 마인드스톰으로 로봇만들기  (1) 2010.01.17
함수는 참 쉽죠잉  (0) 2010.01.11
74LS194  (3) 2009.11.22
쉽지 않은 재귀함수의 이해  (5) 2009.08.11