c/자습
포인터(쉽게 풀어쓴 C언어 EXPRESS)
지트리아
2023. 1. 3. 14:59
용어정리
본문정리
포인터란?
포인터는 메모리의 주소를 가지고 있는 변수이다.
&는 주소 연산자라 하며 변수명을 받아서 변수 주소를 반환한다.
간접 참조 연산자 *
간접 참조란 포인터를 통하여 값을 읽어오거나 값을 변경할 수 있기 때문이다.
포인터 사용시 주의할 점
초기화시 반드시 NULL을 이용하여야 한다.
포인터 연산
p가 어떤 자료형인가에 따라 증감연산자의 경우 2, 4 등으로 증가 할 수 있다.(주소 자료형에 영향을 받음) 가리키는 값을 증가시키고 싶을 때는 (*p)++처럼 괄호를 잘 이용해야 한다.
포인터와 함수
값에 의한 호출 : 복사본이 전달
참조에 의한 호출 : 원본이 전달
scanf()이 포인터를 이용하는 이유가 이것임, scanf()도 함수이기에 참조에 의한 호출을 이용해야 해당 주소에 값이 저장됨
포인터와 배열
배열 이름은 배열이 시작되는 주소와 같으므로 포인터의 역할과 동일하다 할 수 있다.
포인터 사용의 장점
연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있다.
메모리 매핑 하드웨어(메모리처럼 접근할 수 있는 하드웨어 장치를 의미)
참조에 의한 호출
동적 메모리 할당
본문제
Q1.
Q2.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void get_sum_diff(int x, int y, int* p_sum, int* p_diff) {
*p_sum = x + y;
*p_diff = x - y;
}
int main(void) {
int x = 0, y = 0, s = 0, di = 0;
int* sum = &s, * diff = &di;
printf("값 2개를 입력하세요: ");
scanf("%d %d", &x, &y);
get_sum_diff(x, y, sum, diff);
printf("원소들의 합 = %d \n원소들의 차 = %d", *sum, *diff);
return 0;
}
Q3.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_fill(int* a, int size) {
for (int i = 0; i < size; i++) {
a[i] = rand() % 100;
}
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
array_fill(a, sizeof(a) / sizeof(a[0]));
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++){
printf("%d ", a[i]);
}
return 0;
}
Q4.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_print(int* a, int size) {
for (int i = 0; i < size; i++) {
a[i] = rand() % 100;
}
printf("a[] ={ ");
for (int i = 0; i < size; i++) {
printf("%d ", a[i]);
}
printf("}");
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
array_print(a, sizeof(a) / sizeof(a[0]));
return 0;
}
Q5.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void convert(double* grades, double* scores, int size) {
for (int i = 0; i < size; i++) {
scores[i] = grades[i] * 100 / 4.3;
}
}
int main(void) {
srand(time(NULL));
double a[10] = { 0, };
double b[10] = { 0, };
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
a[i] = rand() % 6;
if (a[i] > 4.3) {
a[i] -= 0.7;
}
printf("%lf ", a[i]);
}
printf("\n");
convert(a, b, sizeof(a) / sizeof(a[0]));
for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++) {
printf("%lf ", b[i]);
}
return 0;
}
Q6.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_copy(int* a, int* b, int size) {
for (int i = 0; i < size; i++) {
b[i] = a[i];
}
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
int b[10] = { 0, };
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
a[i] = rand() % 150;
printf("%d ", a[i]);
}
printf("\n");
array_copy(a, b, sizeof(a) / sizeof(a[0]));
for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++) {
printf("%d ", b[i]);
}
return 0;
}
Q7.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_print(int* a) {
for (int i = 0; i < 10; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void array_add(int* a, int* b, int* c, int size) {
for (int i = 0; i < size; i++) {
c[i] = a[i] + b[i];
}
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
int b[10] = { 0, };
int c[10] = { 0. };
for (int i = 0; i < 10; i++) {
a[i] = rand() % 100;
b[i] = rand() % 100;
}
printf("A[] = ");
array_print(a);
printf("B[] = ");
array_print(b);
array_add(a, b, c, sizeof(a) / sizeof(a[0]));
printf("C[] = ");
array_print(c);
return 0;
}
Q8.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_print(int* a) {
for (int i = 0; i < 10; i++) {
a[i] = rand() % 100;
printf("%d\t", a[i]);
}
printf("\n");
}
int array_sum(int* a, int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += a[i];
printf("%d\t", sum);
}
return sum;
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
array_print(a);
printf("\n월급의 합 = %d", array_sum(a, sizeof(a) / sizeof(a[0])));
return 0;
}
Q9.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void array_print(int* a) {
for (int i = 0; i < 10; i++) {
a[i] = rand() % 100;
printf("%d\t", a[i]);
}
printf("\n");
}
int search(int* a, int size, int search_value) {
for (int i = 0; i < size; i++) {
if (a[i] == search_value) {
return i;
}
}
return -1;
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, };
int value = -1, result = -1;
array_print(a);
printf("\n찾을 값을 입력하라: ");
scanf("%d", &value);
result = search(a, sizeof(a) / sizeof(a[0]), value);
if (result == -1) {
printf("해당 값은 없습니다.");
}
else {
printf("월급이 %d만원인 사람의 인덱스 = %d", value, result);
}
return 0;
}
Q10.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void get_lcm_gcd(int x, int y, int* plcm, int* pgcd) {
if (x > y) {
for (int i = y; i > 0; i--) {
if (x % i == 0 && y % i == 0) {
*pgcd = i;
break;
}
}
}
else {
for (int i = x; i > 0; i--) {
if (x % i == 0 && y % i == 0) {
*pgcd = i;
break;
}
}
}
*plcm = x * y / (*pgcd);
}
int main(void) {
int x = 0, y = 0, plcm = 0, pgcd = 0;
printf("두개의 정수를 입력하시오: ");
scanf("%d %d", &x, &y);
get_lcm_gcd(x, y, &plcm, &pgcd);
printf("최소공배수는 %d입니다.\n최대공약수는 %d입니다.", plcm, pgcd);
return 0;
}
Q11.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void make(int* a, int size) {
for (int i = 0; i < size; i++) {
a[i] = rand() % 50;
}
}
void print(int* a, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
void sort(int* a, int size) {
int tempt = -1;
for (int i = 0; i < size; i++) {
for (int j = i; j < size; j++) {
if (a[i] >= a[j]) {
tempt = a[i];
a[i] = a[j];
a[j] = tempt;
}
}
}
}
void merge(int* a, int* b, int* c, int size) {
int x = 0, y = 0, z = 0;
for (int i = 0; i < size; i++) {
if (x == 10 || y == 10) {
if (x == 10) {
c[i] = b[y];
y++;
continue;
}
else if (y == 10) {
c[i] = a[x];
x++;
continue;
}
else if (x == 10 && y == 10) {
break;
}
}
if (a[x] > b[y]) {
c[i] = b[y];
y++;
}
else if (a[x] < b[y]) {
c[i] = a[x];
x++;
}
else if (a[x] == b[y]) {
c[i] = a[x];
i++;
c[i] = b[y];
x++; y++;
}
}
}
int main(void) {
srand(time(NULL));
int a[10] = { 0, }, b[10] = { 0, }, c[20] = { 0, };
make(a, 10); make(b, 10);
sort(a, 10); sort(b, 10);
print(a, 10); print(b, 10);
merge(a, b, c, 20);
print(c, 20);
return 0;
}
Q12.