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.