Computer Science/C\C++

[C언어] malloc 동적할당을 이용한 배열 출력, 역으로 출력(포인터, 이중포인터)_더쉬운방법

hyunjin 2021. 6. 13. 16:16

전에 올린 글에서 너무 어렵게 풀었다..

더 쉽게 풀 수 있는 방법이 있었다.

 arr[i]와 *(arr+i)가 동일함을 잊지말것!

malloc함수가 배열을 주는 것이 아님...

//두개의 1차원 배열을 포함하는 포인터 배열을 선언하고 출력
//이중포인터 이용 포인터 배열 내 mat1과 mat2 위치 바꾸어 출력
#include <stdio.h>
#include <stdlib.h>

int* input(int* x, int s);
void change(int** x);
  int main(void) {
  int n, m,i;//n,m : 각각의 배열 크기/i : 반복문에 쓰일 변수

  printf("각각의 배열 몇개?: ");
  scanf("%d %d", &n, &m);
  //malloc이용해 배열생성
  int *mat1 = (int *)malloc(sizeof(int)*n);//n개의 정수 할당
  int *mat2 = (int *)malloc(sizeof(int)*m);

  mat1=input(mat1, n);
  mat2=input(mat2, m);
  
  int *ptr[] = { mat1,mat2 }; // 두개의 주소를 담는 포인터 배열
  int **dptr = ptr;// ptr의 첫번째 주소값을 담는 포인터
  for (i = 0; i < n; i++)
    printf("%d", *(ptr[0] + i));//ptr[0]에는 mat1의 첫번째 주소가 담겨있다. ex. arr[i]는 *(arr+i)와 동일
  printf("\n");

  for (i = 0; i < m; i++)
    printf("%d", *(ptr[1] + i));
  printf("\n");
  change(dptr);
  for (i = 0; i < m; i++)
    printf("%d", *(ptr[0] + i));
  printf("\n");
  for (i = 0; i < n; i++)
    printf("%d", *(ptr[1] + i));
  printf("\n");

  free(mat1);
  free(mat2);
}

int *input(int *x, int s) {
  int i;
  for (i = 0; i < s; i++){
    printf("배열의 %d번째 요소 입력:",i);
    scanf("%d", x+i);
  }
  return x;
}

void change(int **x) {
  //dptr이용하여 ptr배열의 주소를 바꿔주면 된다.
  int *temp;
  temp = *x;//*x=*dptr
  *x = *(x + 1);
  *(x + 1) = temp;
}