2024. 11. 28. 16:20ㆍ컴퓨터 언어/c언어
기말고사가 2주 남은 관계로 유니티는 잠시 접어두고 시험 공부를 하기로 했다. 최근에 포인터와 동적 할당에 대해 강의를 들었다. 교수님이 정올에 있는 문제를 풀어보면 도움이 될 것이라 하셔서 정올에 있는 포인터 문제를 모두 풀었다, 그중 몇가지를 여기에 올리겠다. 그 전에 아직 포인터의 개념만 아주 간단히 쓰고 가겠다.
우리가 변수를 선언하면 자료형의 크기에 따라 메모리가 할당된다. 여기서 메모리의 시작 주소를 주소값이라고 한다.
포인터는 메모리의 주소 값을 저장하는 변수이다.
#include<stdio.h>
int main() {
int num = 10;//num이라는 int형 변수 선언
int* ptr = # //num의 주소 값을 저장하는 변수 선언
}
이런 식으로 포인터 변수를 선언 한다. 이게 왜 필요한가? 솔직히 나도 아직 잘 모르겠다. 그래서 쥐피티씨에게 물어봤다.
포인터의 역할
- 값의 간접 접근: 메모리 주소를 통해 데이터를 조작할 수 있습니다.
- 동적 메모리 할당: 실행 중에 메모리를 동적으로 할당받아 사용할 수 있습니다.
- 데이터 구조 구현: 링크드 리스트, 트리, 그래프와 같은 복잡한 데이터 구조를 구현할 수 있습니다.
여전히 잘 모르겠다. 하지만 실습하고 사용법을 익히다 보면 자연스럽게 알게 될 것 같다.
내가 푼 문제 3가지를 올려보겠다. 정올 단계별 문제 포인터 부분이다.
1.연습문제 7번
두 정수를 입력받아 값을 바꾸어 출력하고, 5개의 정수를 {1, 3, 9, 4, 2}로 초기화한 후 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오. (참조에 의한 전달을 이용한 함수로 작성할 것)
참조에 의한 전달을 이용하라고 한다.
#include <stdio.h>
void swap(int *ptr1,int *ptr2) {//이름 그대로 a와 b의 숫자를 서로 교환시켜주는 함수이다.
int temp = 0;
temp = *ptr2;
*ptr2 = *ptr1;
*ptr1 = temp;
}
void Ascending_array(int arr[]) { //오름차순으로 정렬을 해주는 함수이다. 정렬 방법은 버블 정렬을 사용했다.
for (int i = 1; i < 5; i++){
for (int j = 0; j < 5 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];//지금 다시보면서 생각났는데 여기서 위에서의 swap함수를 재활용 할 수도 있다.
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int a, b;
int* ptr1 = &a;
int* ptr2 = &b;
scanf("%d%d", ptr1, ptr2);
swap(ptr1, ptr2);
printf("%d %d\n", *ptr1,*ptr2);
int arr[5] = { 1,3,9,4,2 };
int* ptr3 = arr; //ptr3은 arr 배열의 시작 주소를 가르킨다
Ascending_array(ptr3);
for (int i = 0; i < 5; i++) {
printf("%d ", ptr3[i]);
}
}
포인터를 이용해 참조를 이용한 전달로 값을 교환했다. 또한 배열 시작 주소를 포인터로 가르키고 함수에 시작 주소를 보내 함수 내에서 오름차순으로 배열 값을 수정 시켰다. 포인터의 활용법에 대해 감을 좀 잡을 수 있었다.
2.형성평가 4번
10개의 정수를 저장할 수 있는 배열을 선언한 후 포인터 변수를 이용하여 자료를 입력받아 홀수의 개수와 짝수의 개수를 출력하는 프로그램을 작성하시오.
#include<stdio.h>
void fu(int arr[]) {
int odd = 0; //홀수
int even = 0; //짝수
for (int i = 0; i < 10; i++) { //짝수 홀수 갯수 카운트
if (arr[i] % 2 == 0) { //2로 나눴을 때 나머지가 0이면 짝수이다.
even++;
}
else {
odd++;
}
}
printf("odd : %d\neven : %d", odd, even);
}
int main() {
int arr[10];
int* ptr = arr;
for (int i = 0; i < 10; i++) {
scanf("%d", &ptr[i]); // 솔직히 여기서 &을 붙여하는지 말아야하는지 아직 헷갈린다.
}
fu(ptr);
}
배열을 포인터로 입력 받을때는 왜 &을 붙여하는지 잘 모르겠다.
3.연습문제 6
배열의 크기 N을 입력받아 정수포인터를 이용하여 N개의 동적배열을 생성하고 N개의 정수를 입력받아 입력받은 역순으로 출력하는 프로그램을 작성하시오.
#include<stdio.h>
#include<stdlib.h>
void fu(int n) {
int* ptr = (int*)malloc(sizeof(int) * n); //동적할당 자료형 포인터이름 =(자료형)malloc(자료형크기)
for (int i = 0; i < n; i++) { //이런 식으로 사용한다. 사용한 후에는 free로 꼭 해체해줘야 한다고 한다.
scanf("%d", &ptr[i]);
}
for (int i = n; i >= 0; i--) {
printf("%d ", ptr[i]);
}
free(ptr);
}
int main() {
int n;
scanf("%d", &n);
fu(n);
}
malloc형을 배우고 처음 사용해본 문제이다. 아직 익숙하지 않아 좀 더 많은 문제를 풀어보며 손에 익혀야겠다.
나름 요약하고 복습한다고 이렇게 글을 썼는데 이런 식으로 하는게 맞나 싶다. 그리고 쓰다 보니 좀 모르고 그냥 하는 부분들이 좀 많은 것 같기도 하다. 마지막으로 이거 글자크기 어떻게 바꾸는지 좀 찾아봐야겠다.