반응형
SMALL
포인터 예제
// 포인터
#include <stdio.h>
int main(void) {
// 철수 : 101호
// 영희 : 201호
// 민수 : 301호
// 각 문 앞에 '암호'가 결려 있음
int 철수 = 1; // 암호
int 영희 = 2;
int 민수 = 3;
printf("철수네 주소 : %d, 암호 : %d\n", &철수, 철수);
printf("영희네 주소 : %d, 암호 : %d\n", &영희, 영희);
printf("민수네 주소 : %d, 암호 : %d\n\n", &민수, 민수);
// 미션맨 !
// 첫 번째 미션 : 아파트의 각 집에 방문하여 문에 적힌 암호 확인
int *미션맨; // 포인터 변수
미션맨 = &철수;
printf("미션맨이 방문하는 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
미션맨 = &영희;
printf("미션맨이 방문하는 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
미션맨 = &민수;
printf("미션맨이 방문하는 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
// 두 번째 미션 : 각 암호에 3을 곱해라
미션맨 = &철수;
*미션맨 = *미션맨 * 3;
printf("미션맨이 암호를 바꾼 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
미션맨 = &영희;
*미션맨 = *미션맨 * 3;
printf("미션맨이 암호를 바꾼 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
미션맨 = &민수;
*미션맨 = *미션맨 * 3;
printf("미션맨이 암호를 바꾼 곳 주소 : %d, 암호 : %d\n", 미션맨, *미션맨);
// 스파이
// 미션맨이 바꾼 암호에서 1을 빼라!
int* 스파이 = 미션맨;
printf("\n ... 스파이가 미션 수행하는 중...\n");
스파이 = &철수;
*스파이 = *스파이 - 1; // 철수 = 철수 -1;
printf("스파이가 방문하는 곳 주소 : %d, 암호 : %d\n", 스파이, *스파이);
스파이 = &영희;
*스파이 = *스파이 - 1; // 영희 = 영희 -1;
printf("스파이가 방문하는 곳 주소 : %d, 암호 : %d\n", 스파이, *스파이);
스파이 = &민수;
*스파이 = *스파이 - 1; // 민수 = 민수 -1;
printf("스파이가 방문하는 곳 주소 : %d, 암호 : %d\n", 스파이, *스파이);
printf("\n... 철수 영희 민수는 집에 오고서는 바뀐 암호를 보고 깜짝 놀라 ... \n\n");
printf("철수네 주소 : %d, 암호 : %d\n", &철수, 철수);
printf("영희네 주소 : %d, 암호 : %d\n", &영희, 영희);
printf("민수네 주소 : %d, 암호 : %d\n", &민수, 민수);
// 추가적으로 미션맨이 사는 곳의 주소는 &미션맨으로 확인
printf("미션맨의 주소 : %d\n", &미션맨);
printf("스파이의 주소 : %d\n", &스파이);
return 0;
}

배열 예제
// 배열
#include <stdio.h>
int main(void) {
int arr[3] = {5, 10, 15};
int *ptr = arr;
for (int i = 0; i < 3; i++) {
printf("배열 arr[%d]의 값 : %d\n", i, arr[i]);
}
for (int i = 0; i < 3; i++) {
printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
}
ptr[0] = 100;
ptr[1] = 200;
ptr[2] = 300;
for (int i = 0; i < 3; i++) {
//printf("배열 arr[%d]의 값 : %d\n", i, arr[i]);
printf("배열 arr[%d]의 값 : %d\n", i, *(arr + i));
}
for (int i = 0; i < 3; i++) {
//printf("포인터 ptr[%d]의 값 : %d\n", i, ptr[i]);
printf("포인터 ptr[%d]의 값 : %d\n", i, *(ptr + i));
}
// *(arr + i) == arr[i] 똑같은 표현
//
// arr == arr 배열의 첫번째 값의 주소와 동일 == &arr[0]
printf("arr 자체의 값 : %d\n", arr); // 81394680
printf("arr[0]의 주소 : %d\n", &arr[0]); // 81394680
printf("arr 자체의 값이 가지는 주소의 실제 값 : %d\n", *arr); // 100 // *(arr + 0)과 같다.
printf("arr[0]의 실제 값 : %d\n", *&arr[0]); // 100
// *&는 아무것도 없는 것과 같다. &는 주소이며, *는 그 주소의 값이기 때문에,
// *&는 서로 상쇄된다.
return 0;
}

Swap, 포인터 & 주소값으로 배열값 변경하기 예제
// Swap, 포인터 & 주소값으로 배열값 변경하기
#include <stdio.h>
void swap(int a, int b);
void swap_addr(int *a, int *b);
void changeArray(int* ptr);
int main(void) {
int a = 10;
int b = 20;
printf("a의 주소 : %d\n", &a);
printf("b의 주소 : %d\n", &b);
// a와 b의 값을 바꾼다.
printf("Swap 함수 전 => a : %d, b : %d\n\n", a, b);
swap(a, b); // 새로운 주소로 할당된다.
printf("Swap 함수 후 => a : %d, b : %d\n\n", a, b); // "Swap 함수 전"과 같은 주소, 값이다.
// 값에 의한 호출(Call by Value) -> 값만 복사한다는 의미
printf("(주소값 전달)Swap 함수 전 => a : %d, b : %d\n", a, b);
// 주소값을 넘기면? 메모리 공간에 있는 주소값 자체를 넘기면?
swap_addr(&a, &b);
printf("(주소값 전달)Swap 함수 후 => a : %d, b : %d\n", a, b);
// 포인터로 3번째 값을 50으로 변경하기
// 배열일 때 arr2 -> 주소로 3번째 값을 50으로 변경하기
int arr2[3] = { 10,20,30 };
//changeArray(arr2); // 포인터로
changeArray(&arr2[0]); // 배열일 때
for (int i = 0; i < 3; i++) {
printf("%d\n", arr2[i]);
}
return 0;
}
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("Swap 함수 내 => a : %d, b : %d\n\n", a, b);
}
void swap_addr(int *a, int *b) {
int temp = *a; // 값만 전달을 위한 임시 변수
*a = *b;
*b = temp; // *a의 값을 *b에 대입
printf("(주소값 전달)Swap 함수 내 => a : %d, b : %d\n", *a, *b);
}
void changeArray(int *ptr) {
ptr[2] = 50;
}

반응형
LIST
'C' 카테고리의 다른 글
| 구조체(struct) (0) | 2022.11.14 |
|---|---|
| 다차원 배열(Multidimentional Array) (0) | 2022.11.13 |
| 배열 (2) | 2022.10.26 |
| 함수 (0) | 2022.10.23 |
| 조건 & 분기 (0) | 2022.10.22 |