본문 바로가기

2학년/C

[C]포인터(1)

포인터

 변수와 메모리 주소 

  지역변수라고 가정할 때, char num=1; 라고 선언한다면, 컴파일 타임에 컴파일러가 이를 보고 메모리에

  자료형 만큼의 크기를 미리 확보한다 즉, 메모리에 1 byte를 확보한 후 실제로 프로그램이 실행되어 이 선언

  문을 만난 시점에서 시스템에 의해 변수의 주소(메모리주소)를 할당 받고 메모리 주소의 이름이 num이

  된다. 그리고 대입 연산자에 의해 1이라는 값을 메모리에 이진수 비트형태로 저장한다. 

 

 &연산자 

  &연산자는 주소연잔자이다. 변수명 앞에 붙이면 변수가 메모리상에 저장된 주소값을 반환해주는 단항

  연산자이다. 

 

 포인터의 선언과 사용

  포인터는 "변수의 주소" 를 가리킨다.  (따라서 일반적으로 포인터변수의 선언은 포인터변수 = &(변수명)꼴)

  로 나타내는 것이 자명하다)  

  포인터의 선언은 자료형* 포인터변수명; 으로 나타내지만, *연산자에 대해서는 다양한 표기가 가능하다. 

   ex) int* pt1; int * pt2; int *pt3; 세 가지 모두 가능함. 

  int num =12;

  int* p1 = # 이라고 할 때, 

  p는 int*형으로, int형 변수 num의 메모리상 주소값을 저장하는 포인터변수이다. 

  이때, p는 num의 주소를 가리키고(예로 들어, 260ff634) *p는 12로 num의 값과 같다.

  *p에 쓰이는 *는 어떤 주소값이 가리키고 있는 내부 데이터를 반환하는 연산자이다.(포인터 변수의 참조)

  따라서 *연산자를 사용할 땐 반드시 피연산자가 포인터(주소값) 형태여야 한다. 

 

포인터 연산 

 포인터는 16진수 양의 정수로 된 주소값만을 저장한다. 따라서 포인터 변수에 저장된 값끼리의 덧셈,곱셈,

 나눗셈은 실질적으로 의미를 가지지 않는다. 오직 뺄셈만이 포인터 변수의 주소값 간의 물리적 거리를 나타낸다. 

 포인터 변수는 다른 포인터 변수의 값을 대입받을 수 있으며, 주소값끼리의 비교연산을 통해 어떤 변수가 메모리

 상에서 더 높고, 낮은 주소를 가졌는지, 두 포인터가 같은 주소를 가리키고 있는지 비교가능하다. 

 포인터 변수에 대해 증감연산을 하게 되면 포인터변수가 주소값을 저장할 수 있는 자료형의 크기만큼 주소값도 

 증감이 이루어진다.

   

  

'2학년 > C' 카테고리의 다른 글

[C]배열(1)  (0) 2023.07.26
[C]포인터(2)  (0) 2023.07.25
[C] 제어문  (0) 2023.07.23
[C]변수와 연산자(4)  (0) 2023.07.22
[C]변수와 연산자(3)  (0) 2023.07.21