반응형
SMALL

학습목표

1. 변수의 주소를 이해할 수 있다.

2. 포인터의 개념을 이해할 수 있다.

3. 포인터 변수를 선언하고 참조할 수 있다.

4. 포인터의 기억공간의 표현을 이해할 수 있따.

5. 포인터 연산을 이해할 수 있다.

 

주요용어 

포인터 : 변수의 주소 값을 갖는 특별한 변수

void 형 포인터 : 프로그램 실행 시에 자료형이 결정되는 경우에 사용되는 포인터

포인터 연산 : 포인터 변수에 +, - , ++, -- 연산자를 사용하는 연산

 

 

6.2 포인터

6.2.1 포인터의 개요

포인터(pointer) : 변수의 일종

- 변수 : 특정 데이터 값을 가지고 있음

- 포인터 : 특정 데이터가 저장된 기억장소의 주소(번지)값을 가지고 있음

 

따라서 포인터는 기억공간을 변수명으로 접근하지 않고 주소로 접근하기 위해 사용

일반적인 변수의 기억공간 표현

- 변수는 변수 선언에 의해 기억공간이 할당되고

- 할당된 기억공간에 변수에 대입된 데이터가 저장

- 이때 할당된 기억공간은 주소(번지)가 부여되어 있다.

주소를 이용하여 변수와 같은 동일한 작업 가능

> x의 주소 0002 를 이용하여 데이터를 저장할 수 있다.

 

따라서 주소 값(포인터 값)을 다룰 수 있는 변수가 필요

포인터 변수 : 변수의 주소 값을 갖는 특별한 변수

 

 

 

// 변수의 주소 예

#include<stdio.h> 
void main(){ 
   int days=365; 
   int month=12; 
   int Table[5]={1,2,3,4,5}; 

   printf("days의 주소는 %x\n",&days);  
   printf("month의 주소는 %x\n",&month);  
   printf("배열명 Table의 주소는 %x\n",Table);

 // 배열명은 주소를 나타냄  
   printf("배열명 Table첫번째 요소의 주소는 %x\n",&Table[0]);  
   printf("배열명 Table두번째 요소의 주소는 %x\n",&Table[1]);    }

 

 

6.2.2 포인터 변수의 선언

(1) 포인터 변수의 선언

- 형식 : 자료형 * 포인터변수명;

- 사용 예 : int *p;

- 기능 : 변수 p는 포인터 변수로서 정수형의 자료를 갖는 변수의 주소를 갖는다.
int *p
  
   p : 포인터 변수로서 정수형 자료가 수록되어 있는 주소를 갖고 있다.

  *p : 해당 주소에 수록되어 있는 정수형 자료를 갖고 있다.

 // 포인터 변수의 사용 예를 기억공간에서의 표현

 

int a, b; 

 

int *p;     >> 변수 p를 포인터 변수로 선언 

 

a = 5000; 

 

p = &a;   >> 포인터 변수 p에 변수 a의 주소 값을 대입 

 

b = *p;    >> 포인터 변수 p가 가리키는 주소의 내용을 

                 변수 b에 저장 (a의 값 5000이 b에 저장된다) 

 

 

 

 

(2) 포인터 변수의 참조

 어떤 포인터 변수가 가리키는 내용을 읽어 내거나 값을 대입하는 것

 

포인터의 참조 => &, * 연산자 사용

 

int *p, i = 4; 
    *p  =  i ;

 

>> 포인터 변수 p가 기억공간 내 몇 번지를 가르키는지 알 수 없다. <<

 

1) *p = i; 

이것은 포인터 변수 p가 가리키는 번지의 기억장소에

변수 i 의 값을 대입하는 의미

 

포인터의 참조 2

 

int *p, i = 4;

 

      p = &i;

 

     *p = 10;

 

 

//포인터 변수의 참조 예

#include<stdio.h> 
void main(){ 
int *p,i=3,j; 
p=&i;    // 포인터변수 p는 변수 i의 주소를 가리킴
j=*p;     // 포인터변수 p가 가리키는 번지의 내용을 변수 j 에 대입

j++;      // 변수 j의 값을 1 증가
printf("*p = %d \n", *p); 
printf("p = %x \n", p); 
printf("j = %d \n", j);      } 

 

 

//포인터 변수가 매개변수로 사용된 함수 [예]

#include <stdio.h>
int change(int *);  // chang 함수의 원형 선언 
void main(){
   int a = 10;
   int *p = &a; // 포인터 변수 p를 선언하고 변수 a의 주소 저장 
   printf("함수 호출 이전의 a : %d \n", a);
   change(p)  ; /*함수의 매개변수인 k가 포인터이므로 change 함수를 호출할 때   

                     인자로 a 대신 a를 포인트하고 있는 p를 매개변수로 전달*/
   printf("함수 호출 이후의 a : %d \n", a);  }
int change(int *k){  /* change 함수가 호출되면 p의 값(a의 주소)이  k로 전달되고, 가리키게 됨*/ 
   *k = *k + *k; }  /* change 함수 내부에서는 k가 포인트하는 곳의 값을 다루어야 하므로  *k를 사용 
                         (포인터 변수를 매개변수로 하는 함수 호출은 참조에 의한 자료 전달 방법을 사용함)*/ 

반응형
LIST

+ Recent posts