포인터가 매번 약한거 같아서 연습을 했다.
포인터 기본
#include <stdio.h>
int main()
{
/*
& : 주소 출력 (ex : 6487580)
포인터 변수
ㅇ 변수명 앞에 * 을 넣어서 만듬
ㅇ 포인터 변수는 주소를 담는 역활
ㅇ *p = 5 이런식으로 포인터가 가르키는 변수의 값을 변경 가능함
*/
int a = 10;
int *p = &a; // 포인터 p는 a의 주소를 가르킴
printf("a=10 대입\n");
printf("a : %d \n", a); // a값 출력
printf("&a : %d \n", &a); // a의 주소 출력
printf("p : %d \n", p); // p값 출력
printf("*p :%d \n", *p); // p가 가르키는 주소의 값을 출력
a = 20;
printf("\n");
printf("a=20 으로 업데이트\n");
printf("a : %d \n", a); // a값 출력
printf("&a : %d \n", &a); // a의 주소 출력
printf("p : %d \n", p); // p값 출력
printf("*p :%d \n", *p); // p가 가르키는 주소의 값을 출력
*p = 5;
printf("\n");
printf("*p=5 으로 업데이트\n");
printf("a : %d \n", a); // a값 출력
printf("&a : %d \n", &a); // a의 주소 출력
printf("p : %d \n", p); // p값 출력
printf("*p :%d \n", *p); // p가 가르키는 주소의 값을 출력
return 0;
}
그 다음으로는 포인터의 기본이라고 할 수 있는 swap 함수를 구현해 봤다
#include <stdio.h>
void swap_no_pointer(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
void swap_use_pointer(int *x, int *y) // 매개변수를 포인터로 사용할 경우 &a 이런식으로 주소를 넣어주면됨
{
int tmp = *x; // 변수 tmp 에 x가 가르키는 값을 넣음
*x = *y; // x가 가르키는 값에 y가 가르키는 값을 넣음
*y = tmp; // y가 가르키는 값에 변수 tmp의 값을 넣음
}
int main()
{
int a = 10;
int b = 20;
printf("스왑 전\n");
printf("a : %d, b : %d\n\n", a, b);
swap_no_pointer(a, b);
printf("포인터 없는 스왑 후\n");
printf("a : %d, b : %d\n\n", a, b); // call by value 이기 때문에 값이 변하지 않음
swap_use_pointer(&a, &b);
printf("포인터 있는 스왑 후\n");
printf("a : %d, b : %d\n\n", a, b); // call by reference 이기 때문에 값이 변함
return 0;
}
다음으로는 포인터의 친구인 배열
#include <stdio.h>
int main()
{
// 배열의 경우 주소가 연속임 따라서 포인터와 긴밀한 관계
int arr[] = {1, 2, 3, 4}; // 배열선언
printf("arr 주소 출력 <= 배열의 주소는 0번째 주소와 동일하다!(&arr == &arr[0])\n");
printf("&arr : %d\n", &arr);
printf("\n");
// 인덱스로 접근
printf("index를 이용해서 출력\n");
for(int i=0; i<4; i++)
{
printf("arr[%d] : %d ", i, arr[i]);
printf("&arr[%d] : %d\n", i, &arr[i]);
}
printf("\n");
// 포인터로 접근
int *p = &arr[0];
printf("pointer를 이용해서 출력(*p = &arr[0])\n");
for(int i=0; i<4; i++)
{
printf("*(p+%d) : %d ", i, *(p+i)); // 32비트 이므로 4바이트씩 증가한다
printf("p+%d : %d\n", i, p+i);
}
return 0;
}
다음으로는 동적배열을 이해하기 위해 총점과 평균을 받는 프로그램을 만들었다.
#include <stdio.h>
#include <stdlib.h> // malloc 사용시 필요
int main()
{
// 임의의 인원을 받아서 총점, 평균 구하는 프로그램
int total_person = 0;
int sum = 0;
printf("총 인원\n");
scanf("%d", &total_person);
int* p = (int *)malloc(sizeof(int)*total_person); // 메모리할당
for(int i=0; i<total_person; i++)
{
printf("\n%d 번째 : ", i);
scanf("%d", (p+i)); // scanf의 경우 주소가 필요한데 포인터의 경우 주소 그자체이므로 이런식으로 대입
sum += *(p+i);
}
printf("\n총점 : %d",sum);
printf("\n평균 : %.2f", (float)sum/(float)total_person);
return 0;
}
'SW > C C++' 카테고리의 다른 글
[C/C++] 구조체1 (0) | 2023.01.08 |
---|---|
[C/C++] 포인터 문자열 (0) | 2023.01.07 |
[C/C++] Bubble Sort (0) | 2023.01.07 |
[C/C++] 재귀함수 (1) | 2023.01.07 |
[C/C++] 포인터 연습2 (0) | 2022.09.21 |
댓글