2022-08-07 포인터

Yama·2022년 8월 7일
0

C언어 기초

목록 보기
8/15

포인터, 배열에서 포인터사용, SWAP, 나도코딩

#include <stdio.h>
void swap(int a, int b);
void swap_addr(int a, int b); //주소값을 전달해서 값만 던지는게 아니고 주소를 전달해가지고 철수네 영희네 민수네 주소를 준거다.? 미션맨이 swap함수내에서 그들의 암호를 바꾼것이다.?
void changeArray(int* ptr);

int main(void)
{
//포인터

// [철수] : 101호 -> 메모리 공간의 주소 
// [영희] : 201호
// [민수] : 301호
//변수명 한글가능 // 문 앞에 '암호' 가 걸려 있음 

/*int 철수 = 1; //암호
int 영희 = 2; 
int 민수 = 3;

printf("철수네 주소 : %d, 암호 : %d\n", &철수, 철수);
printf("영희네 주소 : %d, 암호 : %d\n", &영희, 영희);
printf("민수네 주소 : %d, 암호 : %d\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", 미션맨, *미션맨);

// 스파이
// 미션맨이 바꾼 암호에서 2를 뺴라 !
int* 스파이 = 미션맨;
 // 스파이(2522124)
 //                    =>        (2522124) 누군가의 아파트 주소
 // 미션맨 (2522124) 

printf("\n ... 스파이가 미션 수행하는 중... \n");
스파이 = &철수;
*스파이 = *스파이 - 2; // 철수 = 철수 -2; , 
printf("스파이가 방문하는 곳 주소 : %d, 암호 : %d\n", 스파이, *스파이);

스파이 = &영희;
*스파이 = *스파이 - 2;  
printf("스파이가 방문하는 곳 주소 : %d, 암호 : %d\n", 스파이, *스파이);

스파이 = &민수;
*스파이 = *스파이 - 2; 
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", &스파이); */



// 배열 ? 배열이 포인터와 아주 가깝다.

/*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)); //*(arr + 1) arr자체는 arr배열의 가장 처음에 있는 주소값으로 부터 i번쨰 있는 값을 가져오는것. 위에있는거랑 문법 완전 똑같음.
}
for (int i = 0; i < 3; i++)
{
	//printf("포인터 ptr[%d] 의 값 : %d\n", i, ptr[i]); //포인터는 각각 배열값에 가서 값을 바꾼다 즉 ptr가 arr은 똑같은걸로 볼수있슴.
	printf("포인터 ptr[%d] 의 값 : %d\n", i, *(ptr +i)); 
}
// *(arr + i) == arr[i] 똑같은 표현
// arr == arr 배열의 첫번쨰 값의 주소와 동일 == &arr[0]
printf("arr 자체의 값 : %d\n", arr);
printf("arr[0] 의 주소 : %d\n", &arr[0]);

printf("arr 자체의 값이 가지는 주소의 실제 값 : %d\n", *arr); // == *(arr+ 0) 
printf("arr[0]의 실제 값 : %d\n", *&arr[0]); 

// *& &뒤에 변수의 주소의 값을 나타내는 것, 
// *& 는 아무것도 없는 것과 같다. &는 주소이며, *그 주소의 값이기 때문에,
// *&는 서로 상쇄된다.
printf("arr[0]의 실제 값 : %d\n", *&*&*&*&*&*&*&arr[0]);
printf("arr[0]의 실제 값 : %d\n", arr[0]); */


// SWAP
/*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", a, b);
swap(a, b);
printf("Swap 함수 후 => a : %d, b : %d\n", a, b);

// 값에 의한 복사 (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); */
//주소값을 전달해서 값만 던지는게 아니고 주소를 전달해가지고 철수네 영희네 민수네 주소를 준거다.? 미션맨이 swap함수내에서 그들의 암호를 바꾼것이다.?


//배열일떄 , arr2 -> 주소
int arr2[3] = { 10, 20, 30 };
//changeArray(arr2);
changeArray(&arr2[0]);
for (int i = 0; i < 3; i++)
{
	printf("%d\n", arr2[i]);
}

// scanf에서 &num 과 같이 &를 사용하는 이유?


return 0;

}

void swap(int a, int b)
{
printf("(Swap 함수내) a의 주소 : %d\n", &a); //메인함수에서 a와b의 공간과 Swap 내의 a,b공간은 서로다르다.
printf("(Swap 함수내) b의 주소 : %d\n", &b);

int temp = a;
a = b;
b = temp;
printf("Swap 함수 내 => a : %d, b : %d\n", a, b);

}
void swap_addr(int a, int b) //주소값을 전달해서 값만 던지는게 아니고 주소를 전달해가지고 철수네 영희네 민수네 주소를 준거다.? 미션맨이 swap함수내에서 그들의 암호를 바꾼것이다.?
{
int temp = a;
a = b;
b = temp;
printf("(주소값 전달)Swap 함수 내 => a : %d, b : %d\n", a, b);
}

void changeArray(int * ptr)
{
ptr[2] = 50;
}

0개의 댓글