C언어 포인터 질문입니다 ㅠㅠ

1~1000까지 난수 배열을 만들고

void array()
{
	int random;
	srand(time(NULL));
	for (random = 0; random < 50; random++) 
		printf("/%d", rand() % 1000 + 1);
	}
}

포인터를 활용해서 이 배열을 거꾸로 뒤집고
최댓값과 최솟값을 구해야 하는데 초보자라 감이 잘 안잡히네요ㅠㅠ
임의로 입력받은 배열은 위에 방식대로 출력이 가능한데
위 코드의 난수 배열 함수를 뒤집으려면 포인터를 사용하여 어떤 방식으로 해야하나요…

  1. 혹시 배열은 배우셨나요? 어디까지 진도를 나갔는지에 따라 답이 크게 바뀝니다. 혹시 배열을 배우셨다면 먼저 배열에 저 난수 값들을 저장해 보세요.
  2. 문제의 정확한 표현이 궁금합니다. 포인터를 사용해서라는 표현은 너무 광범위하네요

배열에 관해서 기초적인 지식만 알고 있어요…
함수를 통해 받은 난수 값을 배열에 저장하는 방법을 알려주시면 감사하겠습니다

굳이 포인터를 사용해서 하고 싶으시다면…

#include <stdio.h>
#include <stdlib.h>

void random_fill(int* begin, int* end) {
    for(int* i = begin; i != end; ++i)
        *i = rand() % 1000 + 1;
}

void iter_swap(int* lhs, int* rhs) {
    int temp = *lhs;
    *lhs = *rhs;
    *rhs = temp;
}

void reverse(int* begin, int* end) {
    while((begin != end) && (begin != --end))
        iter_swap(begin++, end);
}

void print_array(int* begin, int* end) {
    printf("[");
    for(int* i = begin; i != end; ++i)
        printf("%d ", *i);
    printf("\b]\n");
}

int main() {
    int N = 8;
    int arr[ N ] = { 0 };

    random_fill(arr, arr + N);
    print_array(arr, arr + N);
    reverse(arr, arr + N);
    print_array(arr, arr + N);
    return 0;
}

모르는 부분은 질문주십쇼

void myFunction(int arr[], int len)
{
	for (int i = 0; i < len; i++)
		arr[i] = rand() % 1000 + 1; // 배열에 값 대입
}
  1. 배열 길이는 함수에 따로 넘기셔야 합니다
  2. 함수 파라미터의 int arr[]int *arr로 써도 결과는 같습니다. 혹시 더 자세히 알고 싶으시면 KNK라는 책을 참고하시면 좋습니다
  3. for() 괄호 안에서 변수를 선언해 사용하는 것은 1999년 이후 표준(C99라고 합니다)에서 가능합니다. 마찬가지로 1999년 이후 표준에서는 변수 선언을 코드 중간에서 해도 되고, 변수 길이의 배열(int len=10; int arr[len];같은 형태) 을 선언할 수 있습니다. 비쥬얼 스튜디오 최신 버젼을 사용중이시라면 C99를 지원할테니 코드를 좀 더 편하게 작성할 수 있습니다. 다만 그렇게 작성했을 시 시험에서 인정해주는 것은 다른 문제입니다.

배열 뉴비에게 이런 포인터 매직을 벌이시면…ㄷㄷ

int max_element(int* begin, int* end) {
    int ret = INT_MIN;
    while(begin < end)
        ret = std(ret, *begin++);
    return ret;
}

int min_element(int* begin, int* end) {
    int ret = INT_MAX;
    while(begin < end)
        ret = std(ret, *begin++);
    return ret;
}

최대 최소를 빼먹었네요. 주어진 범위를 한 번만 순회할 때는 이렇게 while로 임시 변수 없이 처리할 수도 있습니다.

마법사 육성중임미다.

image

1 Like