πŸ› οΈBackend/βš™οΈC

[Cμ–Έμ–΄] λ°°μ—΄κ³Ό 포인터(1)

junbin2 2025. 10. 16. 20:50

βœ… 1. λ°°μ—΄μ˜ κ°œλ…

(1) λ°°μ—΄(array) μ΄λž€?

  • μ—¬λŸ¬ 개의 λ™μΌν•œ μžλ£Œν˜•μ˜ 값을 연속적인 λ©”λͺ¨λ¦¬ 곡간에 μ €μž₯ν•˜κ³ , 이λ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ 관리할 수 μžˆλ„λ‘ λ§Œλ“  λ³€μˆ˜μž„.
  • 각각의 λ°°μ—΄ μš”μ†ŒλŠ” 0λ²ˆλΆ€ν„° μ‹œμž‘ν•΄ μ°¨λ‘€λ‘œ λΆ€μ—¬λœ 번호(인덱슀)λ₯Ό μ΄μš©ν•˜μ—¬ μ•‘μ„ΈμŠ€ 함

  • λ°°μ—΄μ˜ 차원: λ°°μ—΄μ˜ μš”μ†Œκ°€ λ‚˜μ—΄λ˜λŠ” ꡬ쑰이며, 1차원, 2차원, 3차원 ... 등이 있음.

  • μœ„μ™€ 같이 자료의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” μ˜ˆμ‹œκ°€ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄, λ³€μˆ˜λ§Œ κ°€μ§€κ³  데이터λ₯Ό μ €μž₯ ν•  경우 μ΅œλŒ“κ°’μ„ 찾을 λ•Œ μœ„μ™€ 같이 ν•˜λ‚˜μ”© 전체λ₯Ό 비ꡐ해야 ν•œλ‹€. μ΄λŸ¬ν•œ 과정은 맀우 λΉ„νš¨μœ¨μ μž„. κ·Έλž˜μ„œ 배열을 μ‚¬μš©ν•¨.

βœ… 2. 1차원 λ°°μ—΄

(1) 1차원 λ°°μ—΄ - μ„ μ–Έ

  • μœ„μ™€ 같이 λ™μΌν•œ μžλ£Œν˜•μ˜ λ°°μ—΄λͺ…을 톡해 λ…λ¦½μ μœΌλ‘œ 개수λ₯Ό μ§€μ •ν•΄ λ°°μ—΄μ˜ 크기λ₯Ό μ§€μ •ν•΄μ„œ λ§Œλ“€ 수 있음.

  • int a[5]; 선언을 ν•˜κ²Œ 되면, 5칸의 배열이 λ§Œλ“€μ–΄μ§€λ©°, ν•œ 칸의 ν¬κΈ°λŠ” int 4byte 크기λ₯Ό κ°€μ§€λŠ” 배열이 λ§Œλ“€μ–΄μ§€κ²Œ λœλ‹€. 

[ 물리적인 기얡곡간 ν‘œν˜„ ]

(2) 1차원 λ°°μ—΄ - μ΄ˆκΈ°ν™”

#include <stdio.h>
int main() {
    // 1. μ„ μ–Έκ³Ό λ™μ‹œμ— κ°’ μ§€μ •
    int arr1[5] = {1, 2, 3, 4, 5};

    // 2. μΌλΆ€λ§Œ μ΄ˆκΈ°ν™”ν•˜λ©΄ λ‚˜λ¨Έμ§€λŠ” 0으둜 μžλ™ μ΄ˆκΈ°ν™”
    int arr2[5] = {1, 2}; // arr2 = {1, 2, 0, 0, 0}

    // 3. λͺ¨λ“  값을 0으둜 μ΄ˆκΈ°ν™”
    int arr3[5]; // arr3 = {0, 0, 0, 0, 0}

    // 4. 크기 μƒλž΅ν•˜κ³  μ΄ˆκΈ°κ°’μœΌλ‘œλ§Œ λ°°μ—΄ μ„ μ–Έ
    int arr4[] = {10, 20, 30}; // ν¬κΈ°λŠ” 3으둜 μžλ™ μ„€μ •
    
    // 5. μ„ μ–Έ ν›„ 각각의 μš”μ†Œμ— 값을 μ €μž₯ν•˜λŠ” 방법
    int arr5[5];
    array[0] = 1;
}
  • μœ„μ™€ 같이, 1차원 λ°°μ—΄μ˜ μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•˜λŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μ‘΄μž¬ν•¨.

(3) 1차원 λ°°μ—΄ - μ‚¬μš© μ˜ˆμ‹œ

  • 배열을 μ„ μ–Έκ³Ό λ™μ‹œμ— μΈλ±μŠ€μ™€ 값을 같이 λ„£μ–΄ μ΄ˆκΈ°ν™”λ₯Ό ν•œ κ²½μš°μ΄λ‹€.

βœ… 3. 닀차원 λ°°μ—΄

(1) 2차원 λ°°μ—΄ - μ„ μ–Έ

  • μ—΄μ˜ 수: ν•œ 행을 κ΅¬μ„±ν•˜λŠ” 1차원 λ°°μ—΄μ˜ 크기λ₯Ό μ˜λ―Έν•¨.
  • ν–‰μ˜ 수: μ—΄μ˜ 수둜 μ§€μ •ν•œ 크기의 1차원 λ°°μ—΄μ˜ 수λ₯Ό 의미 ν•  수 있음.
  • λ°°μ—΄μ˜ 전체 크기 = ν–‰μ˜ 수 x μ—΄μ˜ 수

[ 논리적인 기얡곡간 ν‘œν˜„ ]

[ 물리적인 기얡곡간 ν‘œν˜„ ]

(2) 2차원 λ°°μ—΄ - μ΄ˆκΈ°ν™”

#include <stdio.h>
int main() {
    // 1. ν–‰ λ‹¨μœ„λ‘œ κ°’ μ§€μ •
    int arr1[2][3] = { {1, 2, 3}, {4, 5, 6} };

    // 2. μΌλΆ€λ§Œ μ΄ˆκΈ°ν™” (λ‚˜λ¨Έμ§€λŠ” 0)
    int arr2[2][3] = { {1}, {4, 5} }; 
    // arr2 = { {1, 0, 0}, {4, 5, 0} }

    // 3. 1μ°¨μ›μ²˜λŸΌ ν•œ μ€„λ‘œ μ΄ˆκΈ°ν™”
    int arr3[2][3] = { 1, 2, 3, 4, 5, 6 };

    // 4. λͺ¨λ“  값을 0으둜 μ΄ˆκΈ°ν™”
    int arr4[2][3];

    // 5. μ„ μ–Έ ν›„ 각 μš”μ†Œμ— κ°’ λŒ€μž…
    int arr5[2][3];
    arr5[0][0] = 1; arr5[0][1] = 2; arr5[0][2] = 3;
    arr5[1][0] = 4; arr5[1][1] = 5; arr5[1][2] = 6;

    // 6. for문으둜 반볡 μ΄ˆκΈ°ν™”
    int arr6[2][3];
    for(int i=0; i<2; i++){
        for(int j=0; j<3; j++){
            arr6[i][j] = i*3 + j + 1; // 1~6 κ°’ μ±„μš°κΈ°
        }
    }
}

 

  • μœ„μ™€ 같이, 2차원 λ°°μ—΄μ˜ μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•˜λŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μ‘΄μž¬ν•¨.
  • λŒ€λΆ€λΆ„ 1차원 λ°°μ—΄μ˜ μ΄ˆκΈ°ν™” κ³Όμ •μ΄λž‘ λ˜‘κ°™λ‹€κ³  보면 됨.

(3) 3차원 λ°°μ—΄ - μ„ μ–Έ


βœ… 4. charν˜• λ°°μ—΄κ³Ό λ¬Έμžμ—΄

  • C μ–Έμ–΄μ—μ„œλŠ” λ¬Έμžμ—΄μ„ λ‹€μˆ˜μ˜ λ¬Έμžν˜•(char) 자료λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄λ‘œ ν‘œν˜„μ„ 함.

(1) char ν˜• λ°°μ—΄ μ„ μ–Έ ν˜•μ‹

  • 기쑴의 배열을 λ§Œλ“œλŠ” 방법과 λ™μΌν•˜λ©°, str[12]; 둜 배열을 λ§Œλ“€λ©΄ 12칸의 μ“°λ ˆκΈ°κ°’μ΄ λ“€μ–΄κ°„ ν˜•νƒœλ‘œ μ΄ˆκΈ°ν™”κ°€ 됨.
  • λ§Œμ•½ static char static_str[12]; μ΄λŸ¬ν•œ ν˜•νƒœμ˜ μ •μ λ³€μˆ˜λ‘œ λ§Œλ“€λ©΄, '\0'으둜 μ΄ˆκΈ°ν™”κ°€ 보μž₯됨.

(2) char λ°°μ—΄μ˜ μ΄ˆκΈ°ν™” - λ¬Έμžμ—΄ λ‹¨μœ„ μ΄ˆκΈ°ν™”

(3) char λ°°μ—΄μ˜ μ΄ˆκΈ°ν™” - 문자 λ‹¨μœ„λ‘œ μ΄ˆκΈ°ν™”

(4) char λ°°μ—΄μ˜ μ΄ˆκΈ°ν™” 주의 사항

  • λ¬Έμžμ—΄μ„ μ €μž₯ν•  수 μžˆλŠ” 크기의 맞게 배열을 μ„ μ–Έν•˜κ³  크기에 맞게 배열에 값을 λ„£μ–΄μ•Ό 함.

(5) char 배열을 μ΄μš©ν•œ λ¬Έμžμ—΄ ν™œμš© μ˜ˆμ‹œ

  • char ν˜• 배열을 μ„ μ–Έν•œ λ’€, μž…λ ₯ 받은 λ¬Έμžμ—΄μ„ ν•΄λ‹Ή 배열에 λ„£κ³  좜λ ₯ λ˜ν•œ λ°˜λ³΅λ¬Έμ„ 톡해 ν•΄λ‹Ή λ°°μ—΄μ—μ„œ λ½‘μ•„μ„œ 좜λ ₯함.

βœ… 5. ν•¨μˆ˜μ™€ λ°°μ—΄ 인수 전달

(1) ν•¨μˆ˜μ— λ°°μ—΄ 인수 전달 방법

  • ν˜•μ‹ λ§€κ°œλ³€μˆ˜μ—μ„œ int arr[] μ •μˆ˜ν˜• 배열을 받을 수 μžˆλ„λ‘ λ§€κ°œλ³€μˆ˜ 선언을 ν•΄μ€˜μ•Ό ν•œλ‹€.
  • λ˜ν•œ, μ‹€ λ§€κ°œλ³€μˆ˜μ—μ„œλŠ” 값을 전달 ν•  λ•Œ, λ°°μ—΄μ˜ λ°°μ—΄λͺ…(λ³€μˆ˜λͺ…)을 λ„˜κΉ€μœΌλ‘œμ¨, 배열을 λ„˜κΈΈ 수 있음.

(2) ν•¨μˆ˜μ— λ°°μ—΄ 인수 전달 방법 - 차원에 λ”°λ₯Έ λΆ„λ₯˜

  • λ°°μ—΄μ˜ κ·œκ²©μ„ μ•Œ 수 μžˆλ„λ‘ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

  • 이와 같이 첫째 μ°¨μ›μ˜ κ°œμˆ˜λŠ” μ§€μ •ν•  ν•„μš”λŠ” μ—†μŒ.
  • ν•˜μ§€λ§Œ, 2차원, 3μ°¨μ›μœΌλ‘œ λ„˜μ–΄κ°ˆ 경우 첫째 차원을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€μ˜ κ°œμˆ˜λŠ” λ§žμΆ”μ–΄μ•Όν•¨.
  • μ΄λ ‡κ²Œ ν•΄μ•Όν•˜λŠ” μ΄μœ λŠ”, 1차원 λ°°μ—΄μ˜ 경우 ν•¨μˆ˜μ— λ„˜κΈΈ λ•Œ μžλ™μœΌλ‘œ ν¬μΈν„°λ‘œ λ³€ν™˜μ΄ λ˜μ–΄μ„œμž„.
  • 즉, ν•¨μˆ˜μ˜ 포인터(μ£Όμ†Œκ°’)λ₯Ό λ„˜κΉ€μœΌλ‘œμ¨ ν•΄λ‹Ή 배열이 μ–΄λ””μ„œλΆ€ν„° μ‹œμž‘ν•˜λŠ”μ§€ μ•Œ 수 있게 됨.

  • λͺ¨λ“  차원 배열은 μœ„μ™€ 같이 λ©”λͺ¨λ¦¬ κ΄€μ μ—μ„œλŠ” μ—°μ†μ μœΌλ‘œ μ €μž₯이 λœλ‹€.
  • 즉, ꡳ이 2차원 λ°°μ—΄μ˜ 개수λ₯Ό 넣을 ν•„μš”κ°€ μ—†μ§€μ•Šλ‚˜? λΌλŠ” μ˜λ¬Έμ„ κ°€μ§ˆ 수 있음.
  • ν•˜μ§€λ§Œ, λ©”λͺ¨λ¦¬ κ΄€μ μ—μ„œ μ—°μ†μ μœΌλ‘œ μ €μž₯이 되기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” κ²ƒμž„.
  • μ΄μœ λŠ” 연속적인 μ €μž₯λ•Œλ¬Έμ— μ–΄λŠ 뢀뢄이 행이고 열인지 κ΅¬λΆ„ν•˜κΈ°κ°€ 어렀움.
  • 즉, ꡬ뢄을 μœ„ν•΄μ„œ ν–‰μ—΄μ˜ ν‘œμ‹œμΈ 개수λ₯Ό ν‘œμ‹œν•΄μ„œ λ³΄λ‚΄λŠ”κ²ƒμž„.
  • 1차원 λ°°μ—΄: κ·Έλƒ₯ κΈΈμ­‰ν•œ 쀄
  • 2차원 λ°°μ—΄: κΈΈμ­‰ν•œ 쀄이 μ—¬λŸ¬ 개 μžˆλŠ”λ°, λͺ‡ μΉΈμ”© λ‚˜λˆ μ•Ό ν•˜λŠ”μ§€ μ•Œμ•„μ•Ό 각 μ€„μ˜ μ‹œμž‘μ μ„ 찾을 수 있음