C 언어에서 2차원 벡터를 참조로 전달하는 방법

2024-04-02

2차원 벡터를 참조로 전달하는 C 프로그래밍

포인터를 사용하여 전달

  • 함수 선언:
void print_vector(int *vector, int rows, int cols);
  • 함수 호출:
int main() {
  int vector[2][3] = {{1, 2, 3}, {4, 5, 6}};
  print_vector(&vector[0][0], 2, 3);
  return 0;
}
  • 설명:

    • vector는 2차원 배열의 첫 번째 요소를 가리키는 포인터입니다.
    • rows는 2차원 배열의 행 수입니다.
    • cols는 2차원 배열의 열 수입니다.

typedef를 사용하여 전달

  • 헤더 파일:
typedef int Vector[2][3];

void print_vector(Vector vector, int rows, int cols);
  • 소스 파일:
#include "header.h"

int main() {
  Vector vector = {{1, 2, 3}, {4, 5, 6}};
  print_vector(vector, 2, 3);
  return 0;
}
    • Vectorint형 2차원 배열을 나타내는 새로운 타입입니다.
    • print_vector 함수는 Vector 타입의 변수를 받습니다.

두 가지 방법의 장단점

  • 포인터를 사용하는 방법:

    • 장점:

      • 코드가 간단합니다.
    • 단점:

      • 포인터를 사용하는 것은 위험할 수 있습니다.
      • 메모리 누수가 발생할 가능성이 있습니다.
      • 코드가 더 안전합니다.
      • 메모리 누수 가능성이 적습니다.
      • 코드가 더 복잡합니다.

참고:

  • C++에서는 2차원 벡터를 참조로 전달하는 더 간단한 방법이 있습니다.
  • std::vector 클래스를 사용하면 포인터나 typedef를 사용하지 않고 2차원 벡터를 참조로 전달할 수 있습니다.



예제 코드

#include <stdio.h>

// 포인터를 사용하여 2차원 벡터를 참조로 전달
void print_vector(int *vector, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      printf("%d ", vector[i * cols + j]);
    }
    printf("\n");
  }
}

// typedef를 사용하여 2차원 벡터를 참조로 전달
typedef int Vector[2][3];

void print_vector2(Vector vector, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      printf("%d ", vector[i][j]);
    }
    printf("\n");
  }
}

int main() {
  // 포인터를 사용하는 방법
  int vector[2][3] = {{1, 2, 3}, {4, 5, 6}};
  print_vector(&vector[0][0], 2, 3);

  // typedef를 사용하는 방법
  Vector vector2 = {{1, 2, 3}, {4, 5, 6}};
  print_vector2(vector2, 2, 3);

  return 0;
}
1 2 3
4 5 6
1 2 3
4 5 6

설명:

  • 이 예제 코드는 두 가지 방법 모두 2차원 벡터를 함수에 참조로 전달하는 방법을 보여줍니다.
  • print_vector 함수는 포인터를 사용하여 2차원 벡터를 받습니다.
  • print_vector2 함수는 typedef를 사용하여 2차원 벡터를 받습니다.
  • 두 함수 모두 2차원 벡터의 모든 요소를 출력합니다.



2차원 벡터를 참조로 전달하는 대체 방법

구조체를 사용하여 전달

  • 헤더 파일:
typedef struct Vector {
  int rows;
  int cols;
  int **data;
} Vector;
  • 소스 파일:
#include "header.h"

void print_vector(Vector vector) {
  for (int i = 0; i < vector.rows; i++) {
    for (int j = 0; j < vector.cols; j++) {
      printf("%d ", vector.data[i][j]);
    }
    printf("\n");
  }
}

int main() {
  Vector vector;
  vector.rows = 2;
  vector.cols = 3;
  vector.data = malloc(sizeof(int *) * vector.rows);
  for (int i = 0; i < vector.rows; i++) {
    vector.data[i] = malloc(sizeof(int) * vector.cols);
  }

  // 2차원 벡터의 값을 초기화합니다.

  print_vector(vector);

  free(vector.data);

  return 0;
}
  • 설명:

    • Vector 구조체는 2차원 벡터를 나타냅니다.
    • rows는 2차원 벡터의 행 수입니다.
    • cols는 2차원 벡터의 열 수입니다.
    • data는 2차원 벡터의 데이터를 가리키는 포인터입니다.
void print_vector(int **vector, int rows, int cols) {
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      printf("%d ", vector[i][j]);
    }
    printf("\n");
  }
}

int main() {
  int vector[2][3] = {{1, 2, 3}, {4, 5, 6}};
  print_vector(&vector, 2, 3);

  return 0;
}
    • vector는 2차원 배열을 가리키는 참조 변수입니다.
    • print_vector 함수는 참조 변수를 사용하여 2차원 배열을 받습니다.

참고:

  • 구조체를 사용하는 방법은 가장 안전하고 유연한 방법입니다.
  • 참조 변수를 사용하는 방법은 가장 간단한 방법이지만, 포인터를 사용하는 것만큼 위험할 수 있습니다.

c pointers multidimensional-array


C++에서 단일 비트 설정, 지우기 및 토글하기

다음은 C++에서 단일 비트를 설정, 지우기 및 토글하는 방법에 대한 세 가지 일반적인 기술입니다.특정 위치의 비트를 1로 설정하려면 OR 연산자를 사용하여 해당 비트 마스크를 원수 값에 추가할 수 있습니다. 예를 들어...


두 배열의 요소가 동일한지 확인하는 효율적인 방법 (순열 고려)

순열을 고려하여 두 배열의 동일성을 검사하는 보다 효율적인 방법은 다음과 같습니다.해시 테이블 사용각 배열의 각 요소를 해시 테이블에 키로 저장하고, 해당 키의 값을 증가시킵니다.두 배열을 모두 처리한 후, 해시 테이블의 모든 키-값 쌍을 비교합니다...


c 언어로 while 루프를 사용하여 제곱 합 구하기 (1+2²+3³과 같은 경우)

1 + 2^2 + 3^3 + ... + N^N코드:코드 설명:#include <stdio. h>: 표준 입력 및 출력 함수를 위한 헤더 파일 포함int main(): 프로그램의 시작을 나타내는 메인 함수 선언int n, sum = 0, i = 1;: 변수 선언 n: 합산할 제곱 수의 개수sum: 제곱 합 저장 변수i: 반복 루프 제어 변수...


c pointers multidimensional array

C++ 포인터와 참조 변수 차이점: 안전하고 효율적인 코드 작성하기

선언:포인터 변수: 변수 이름 뒤에 * (별표)를 사용하여 선언합니다.참조 변수: 변수 이름 뒤에 & (앰퍼샌드)를 사용하여 선언합니다.초기화:포인터 변수: 선언 시 nullptr로 초기화하거나 다른 메모리 위치의 주소로 초기화해야 합니다