
포인터는 다른 변수의 주소를 저장하는 변수입니다. 흔히 '포인터가 변수를 가리킨다'고도 표현합니다.
#include <stdio.h>, int main(void), return 0; 등 구문은 특별히 필요하지 않은 경우 생략합니다.&)int형 변수 a가 메모리 100 ~ 103번지까지 4바이트에 걸쳐 할당됨
int형 a의 주소는 100&: &변수명으로 변수명의 주소를 구할 수 있음*)자료형 *포인터명 형태로 포인터 선언자료형엔 저장하려는 주소에 위치한 변수의 자료형을 적음int *pa: int형 변수의 주소를 저장하는 포인터 pa를 선언자료형을 가리키는 포인터를 (자료형) *형 포인터라고도 부름pa는 int * 형int a; // 변수 a 선언
int *pa; // 포인터 pa 선언
pa = &a; // pa에 a의 주소 대입 -> 포인터 pa는 변수 a를 가리킴
pa = &a로 포인터 pa에 변수 a의 주소 (&a)를 저장int *pa = &a와 같이 포인터의 선언과 동시에 초기화도 가능pa가 a를 가리킴 (pa -> a)
// 위 코드에서 계속
*pa = 22; // 포인터로 변수 a에 22 대입
printf("변수명으로 a의 값 출력: %d\n", a);
printf("포인터로 a의 값 출력: %d\n", *pa);
// [출력]
// 변수명으로 a의 값 출력: 22
// 포인터로 a의 값 출력: 22
*: *포인터명으로 포인터명이 가리키는 변수를 사용할 수 있음*pa = 22: pa가 가리키는 a에 22를 대입printf("%d\n", *pa): pa가 가리키는 a의 값 22를 출력*는 간접참조 연산자 *와 동일한 기호지만 의미가 다름!!&a = &b와 같이 a의 주소를 b의 주소로 바꾸는 건 불가능
int a = 5, b = 10; // int형 변수 a, b 선언
int* p = &a; // int*형 포인터 p 선언: a를 가리킴
p = &b; // p에 b의 주소 대입해 값을 바꿈
int a;
printf("주소의 크기: %d바이트\n", sizeof(&a));
printf("int형 변수의 주소: %p\n", &a);
// int형 변수의 주소: 00000000005FFE8C
// 주소의 크기: 8바이트
// 위 코드에서 계속
int *pa = &a;
printf("포인터의 크기: %d바이트\n", sizeof(pa));
// 주소의 크기: 8바이트
(자료형) * 형이라고 부름pa, &a는 모두 int *형// 가능한 경우
int a = 5;
int *pa, *pb;
pa = &a; // pa는 a를 가리킴
pb = pa; // pb에 pa의 값을 대입 -> pb도 a를 가리킴
// 불가능한 경우
double *pc;
pc = pa;
// [실행결과] error: assignment to 'double *' from incompatible pointer type 'int *'
double*형 포인터 pc에, int*형 포인터 pa의 값을 대입할 수 없음#include <stdio.h>
void swap(int x, int y);
int main(void){
int a = 33, b = 9;
swap(a, b);
printf("a: %d, b: %d\n", a, b);
return 0;
}
void swap(int a, int b){
int temp;
temp = a;
a = b;
b = temp;
}
// [출력] a: 33, b: 9

swap을 호출하면 main 함수 a, b의 값만 복사되어 swap 함수의 a, b에 저장됨swap 내부에선 복사본의 값만 변경되며, main의 a, b의 값에는 변동이 없음#include <stdio.h>
void swap(int *pa, int *pb);
int main(void){
int a = 33, b = 9; // int형 변수 초기화
swap(&a, &b); // a, b의 주소를 swap 함수에 인수로 보냄
printf("a: %d, b: %d\n", a, b);
return 0;
}
void swap(int *pa, int *pb){
int temp;
temp = *pa; // temp에 pa가 가리키는 변수의 값 저장
*pa = *pb; // pa가 가리키는 변수에 pb가 가리키는 변수의 값을 저장
*pb = temp; // pb가 가리키는 변수에 temp의 값 저장
}
// [출력] a: 9, b: 33

swap 함수에 a의 주소 &a와 b의 주소 &b를 매개변수로 보냄pa는 a를, pb는 b를 가리킴*pa, *pb를 사용해 해당 주소의 실제 변수 값을 변경키보드로 실수 3개를 입력한 후, 큰 숫자부터 작은 숫자로 정렬한 뒤 출력하는 프로그램을 작성하세요.
swap 함수를 응용해서 구현#include <stdio.h>
// 두 실수의 값을 변경
void swap(double* pa, double* pb);
// 세 변수의 값을 정렬
void line_up(double* p1, double* p2, double* p3);
int main(void){
double d1, d2, d3;
printf("실수값 3개 입력: ");
scanf("%lf %lf %lf", &d1, &d2, &d3);
line_up(&d1, &d2, &d3);
printf("%.1lf, %.1lf, %.1lf", d1, d2, d3);
return 0;
}
void swap(double* pa, double* pb){
double temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
// 버블 정렬 방식으로 양옆 원소 교환
// swap이 주소를 매개변수로 받으므로
// 주소가 저장된 포인터를 인수로 보내면 됨
void line_up(double* p1, double* p2, double* p3){
if (*p1 < *p2) swap(p1, p2);
if (*p2 < *p3) swap(p2, p3);
if (*p1 < *p2) swap(p1, p2);
}
// [입력] 실수값 3개 입력: 3.5 1.7 2.4
// [출력] 3.5, 2.4, 1.7