학습목표
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를 사용
(포인터 변수를 매개변수로 하는 함수 호출은 참조에 의한 자료 전달 방법을 사용함)*/
'방송통신대학 > C 프로그래밍' 카테고리의 다른 글
포인터와 배열 char pointer , array (0) | 2020.06.09 |
---|---|
포인터변수의 선언과 참조 pointer variable Declaration (3) | 2020.06.08 |
char형 배열과 문자열 (0) | 2020.06.06 |
다차원 배열 array (0) | 2020.06.05 |
1차원 배열 array (0) | 2020.06.04 |