주소(address) 연산자 & 포인터 변수 , 역참조 연산자*
성명과 점수를 입력하여 합격여부를 판정하는 프로그램(pointPreview.c)
주소(address)
메모리의 저장장소의 위치를 나타내는 주소 값
주소(address)는 1바이트 단위의 연속적인 번호로 구성
주소 값은 4바이트(16진수 8자리)로 표현
주소 연산자 &
&변수
변수의 주소 값을 알아내려면 변수 앞에 주소 연산자 & (ampersand)를 이용
주소 값 이용 장단점
주소 값을 이용하여 데이터를 간접 접근
배열접근, 주소에 의한 매개변수
프로그램이 간결하고 효율적
복잡하고 어려운 단점
변수의 주소 예
포인터 변수
포인터(Pointer)
메모리 주소를 표현 (pointer == address)
포인터 변수
메모리 주소를 저장하는 변수
변수의 주소를 저장하는 변수
변수의 포인터를 저장하는 변수
포인터 변수의 선언
형식
:data_type형 변수주소를 저장할 포인터 변수 선언
포인터가 가리키는 변수의 자료 형에 맞추어 형을 선언해야 함
사용 예
int i; //정수형 변수
int* prt; //정수형 변수에 대한 포인터 변수
ptr = &i; //정수형 변수의 주소를 포인터 변수에 대입
포인터 변수 선언 예
char c = 'A'; //문자형 변수 선언
char *pc; //문자형 변수의 주소를 저장할 포인터변수
int i = 123; //정수형 변수 선언
int *pi; //정수형 변수의 주소를 저장할 포인터변수
float f = 23.45f; //float 실수형 변수 선언
float *pf; //float 실수형 변수의 주소를 저장할 포인터변수
double d = 67.89; //double형 변수 선언
double *pd; //double형 변수의 주소를 저장할 포인터변수
pc = &c; //문자형 포인터변수에 문자변수의 주소 대입
pi = &i; //정수형 포인터변수에 정수변수의 주소 대입
pf = &f; //float형 포인터변수에 float변수의 주소 대입
pd = &d; //double형 포인터변수에 double변수의 주소 대입
포인터 변수의 값
포인터 변수는 주소(address) 값만을 저장
역참조 연산자 *
참조(reference)
포인터 변수 ptr은 변수 i를 참조한다.
역참조 (dereference) 연산자 *
포인터 변수 앞에 연산자 *를 붙이면 그 포인터가 가리키는 변수를 지칭
간접 참조 연산자 (indirection operator)
포인터 변수의 데이터 형
포인터가 가리키는 변수의 자료 형에 맞추어 형을 선언해야 하는 이유
포인터 변수는 참조 변수의 시작 주소 값을 저장하고, 이 주소 값을 시작하여 어디까지의 변수 크기로 내용 값을 인지할 지의 여부를 결정해야 하기 때문
포인터 변수 사용 예
//포인터와 변수형(pointer.c)
#include <stdio.h>
int main()
{
char c = 'A';
char *pc;
int i = 123;
int *pi;
float f = 4.56;
float *pf;
double d = 78.9;
double *pd;
//변수 c의 주소를 pc포인터 변수에 대입
//같은 데이터 형의 포인터변수를 이용하여 변수의 주소 대입
pc = &c;
pi = &i;
pf = &f;
pd = &d;
printf(">>변수의 주소\n");
printf("&c = %p, &pc = %p\n", &c, &pc);
printf("&i = %p, &pi = %p\n", &i, &pi);
printf("&f = %p, &pf = %p\n", &f, &pf);
printf("&d = %p, &pd = %p\n", &d, &pd);
printf(">>변수의 값\n");
printf("c = %5c, pc = %X, *pc = %5c\n", c, pc, *pc);
printf("i = %5d, pi = %X, *pi = %5d\n", i, pi, *pi);
printf("f = %5.2f, pf = %X, *pf = %5.2f\n", f, pf,*pf);
printf("d = %5.2f, pd = %X, *pd = %5.2f\n", d, pd, *pd);
포인터 증가/감소
포인터 변수에 저장된 주소 값의 증가와 감소
+, ++, -, -- 연산자 사용 가능
포인터 변수에 저장되는 변수형의 크기(sizeof(datatype))
에 따라 증가/감소 처리
증가연산에 따른 주소 값 계산
p + 3 = p + sizeof(datatype)*3
포인터 증가 예
포인터 연산 예
//포인터 연산
#include <stdio.h>
int main()
{
int i1 = 123, i2 = 456;
int *pi;
pi = &i1;
printf("&i1 = %p, i1 = %5d\n", &i1, i1);
printf("&i2 = %p, i2 = %5d\n", &i2, i2);
printf("Before : pi = %p, *pi = %5d\n", pi, *pi);
pi--; // == (pi = pi - 1);
printf("pi-- : pi = %p, *pi = %5d\n", pi, *pi);
pi++; // == (pi = pi + 1);
printf("pi++ : pi = %p, *pi = %5d\n", pi, *pi);
return 0;
}
포인터 변수의 형 변환
포인터 변수 형 변환 예
void *
어떠한 자료 형의 포인터도 가질 수 있는 포인터
void형 포인터를 다른 포인터 변수에 대입할 때 형 변환 연산자 필요
void형 포인터는 증가, 감소 연산이 불가능하므로 연산이 필요한 경우 형 변환 연산자를 이용
NULL 포인터
포인터 변수의 초기값으로 사용
헤더파일에 정의되어 있는 포인터 상수로서 0번지의 주소 값을 의미
포인터 변수 선언 시 지정할 특별한 초기 값이 없는 경우에 NULL을 초기 값으로 저장
NULL이 저장된 포인터 변수는 아무 변수도 가리키고 있지 않다는 의미로서 이용
포인터 변수가 다른 변수를 가리키는 저장 값을 갖는지를 검사하는데 이용
포인터 사용 시 주의사항
포인터 변수에 주소지정 없이 값을 대입하거나 연산할 수 없다
포인터식에 +, - 이외의 다른 산술연산(*, /, %) 사용불가
데이터 형이 다른 변수를 대입할 때 경고발생, 값의 해석이 달라짐
포인터가 가리키는 변수의 값을 연산할 때 괄호 “()” 사용
번외
연습문제(2)
1)두 개의 실수를 각각 변수에 입력하고, 이들 변수를 가리키는 포인터를 이용하여 사칙연산(+, -, *, /) 결과를 출력하는 프로그램 작성
'myPPT' 카테고리의 다른 글
16C ~ 18C 유럽 절대주의 (0) | 2015.06.08 |
---|---|
TCP/IP (0) | 2015.06.06 |
전자파 차폐공사 (0) | 2015.06.02 |
Negative and zeroth-order resonator & Fundamental aspects of leaky-wave structures (0) | 2015.05.28 |
다양한 액체에 따른 얼음의 녹는 속도 비교 (1) | 2015.05.26 |