1. 포인터란?
- 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 함.
- 포인터는 주소값을 저장.
ex) int n=100; // 변수의 선언
int *ptr=&n; // 포인터의 선언
2. 포인터 연산자
- 주소 연산자(&) // 변수 이름 앞에 사용, 해당 변수의 주소값을 반환, 번지 연산자
- 참조 연산자(*) // 포인터의 이름이나 주소 앞에 사용, 포인터에 가리키는 주소에 저장된 값을 반환.
3. 포인터 선언
- 타입 *포인터 이름 = &변수이름;
- 타입 *포인터 이름= 주소값;
ex)
int num01 = 1234;
double num02 = 3.14;
int* ptr_num01 = &num01;
double* ptr_num02 = &num02;
② printf("포인터 ptr_num01이 가리키고 있는 주소값은 %p입니다.\n", ptr_num01);
③ printf("포인터 ptr_num02가 가리키고 있는 주소값은 %p입니다.\n", ptr_num02);
printf("포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num01);
printf("포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 %f입니다.\n", *ptr_num02);
실행결과
포인터 ptr_num01이 가리키고 있는 주소값은 0x7ffdfae4e27c입니다.
포인터 ptr_num02가 가리키고 있는 주소값은 0x7ffdfae4e270입니다.
포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 1234입니다.
포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 3.140000입니다.
4. 포인터 연산
// 0으로 초기화는
=0 , =NULL , =0x00
// int는 4byte씩 증가
char는 1byte씩 증가
double은 8byte씩 증가 // 자료형에 따라 증가되는 byte수 달라.
5. 인수 전달 방법
- 값에 의한 전달(call by value)
// 인수로 전달되는 변수가 가지고 있는 값을 함수 내의 매개변수에 복사하는 방밥, 복사된 겂으로 초기화된 매개변수는 인수로 전다로딘 변수와는 완전히 별개의 변수가 됨. 매개변수의 조작은 인수로 전달되는 변수에 아무런 영향을 미치지 않음.
#include <stdio.h>
void local(int);
int main(void)
{
int var = 10;
printf("변수 var의 초깃값은 %d입니다.\n", var);
local(var);
printf("local() 함수 호출 후 변수 var의 값은 %d입니다.\n", var);
return 0;
}
void local(int num)
{
num += 10;
}
변수 var의 초기값은 10입니다.
local() 함수 호출 후 변수 var의 값은 10입니다.
- 참조에 의한 전달(call by reference)
// 변수의 값을 전달하는 것이 아닌, 해당 변수의 주소값을 전달함. 즉, 함수의 매개변수에 인수로 전다로딘 변수의 원래 주소겂을 저장. 인수로 전달된 변수의 값을 함수 내에서 변겅할 수 있게 됨.
#include <stdio.h>
void local(int*);
int main(void)
{
int var = 10;
printf("변수 var의 초깃값은 %d입니다.\n", var);
local(&var);
printf("local() 함수 호출 후 변수 var의 값은 %d입니다.\n", var);
return 0;
}
void local(int* num)
{
*num += 10;
}
변수 var의 초기값은 10입니다.
local() 함수 호출 후 변수 var의 값은 20입니다.
6. 포인터의 포인터
- 이중 포인터
- void 포인터 // 주소값 저장 외 아무것도 할 수 없음. 명시적 타입 변환 작업 후 사용해야함.
int num = 10; // 변수 선언
void* ptr_num = # // void 포인터 선언
*(int*)ptr_num = 20; // void 포인터를 통한 메모리 접근
printf("void 포인터 ptr_num가 가리키는 주소에 저장된 값은 %d입니다.\n", *(int*)ptr_num);
- 함수 포인터
void (*ptr_func) (int, int);
* 구구단
#include <stdio.h>
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
double calculator(double , double, double (*func)(double, double));
int main(void)
{
double (*calc)(double, double) = NULL; // 함수 포인터 선언
double result = 0;
double num01 = 3, num02 = 5;
char oper = '*';
switch (oper)
{
case '+':
calc = add;
break;
case '-':
calc = sub;
break;
case '*':
calc = mul;
break;
case '/':
calc = div;
break;
default:
puts("사칙연산(+, -, *, /)만을 지원합니다.");
}
result = calculator(num01, num02, calc);
printf("사칙 연산의 결과는 %lf입니다.\n", result);
return 0;
}
double add(double num01, double num02)
{
return num01 + num02;
}
double sub(double num01, double num02)
{
return num01 - num02;
}
double mul(double num01, double num02)
{
return num01 * num02;
}
double div(double num01, double num02)
{
return num01 / num02;
}
double calculator(double num01, double num02, double (*func)(double, double))
{
return func(num01, num02);
}