🀷🏼‍♀️ Etc.../- C, C++, Python, Android

[C μ–Έμ–΄] ν¬μΈν„°λ‘œ 1차원 λ°°μ—΄ 닀루기 (μ£Όμ†Œ μ ‘κ·Ό 및 μ›μ†Œ κ°’ μ ‘κ·Ό)

Wonit 2021. 7. 3. 11:21

 

λ°°μ—΄κ³Ό ν¬μΈν„°μ˜ 관계

 

포인터와 배열은 맀우 κΈ΄λ°€ν•œ 관계λ₯Ό κ°–κ³  μžˆλ‹€κ³  μ—¬λŸ¬ μ„œμ  및 μžλ£Œμ—μ„œ 이야기 ν•œλ‹€.

 

μ–΄λ–€ λΆ€λΆ„μ—μ„œλŠ” 배열이 포인터λ₯Ό λŒ€μ²΄ν•˜κΈ°λ„ ν•˜κ³  ν˜Ήμ€ 포인터가 배열을 λŒ€μ²΄ν•˜κΈ°λ„ ν•œλ‹€.

 

배열을 배울 λ•Œ μš°λ¦¬λŠ” λ‹€μŒκ³Ό 같은 λ‚΄μš©μ„ μ•Œ 수 μžˆμ—ˆλ‹€.

 

λ°°μ—΄μ˜ 이름(λ³€μˆ˜λͺ…)은 ν•΄λ‹Ή λ°°μ—΄μ˜ μ£Όμ†Œμž„κ³Ό λ™μ‹œμ— 첫 번째 μš”μ†Œμ˜ μ£Όμ†Œ κ°’ 이닀!

 

μ•žμ„  μ‹œκ°„μ— ν¬μΈν„°μ—μ„œλŠ” 또 이런 λ‚΄μš©μ„ μ•Œ 수 μžˆμ—ˆλ‹€.

 

포인터 λ³€μˆ˜μ— 올 수 μžˆλŠ” 값은 μ˜€λ‘œμ§€ μ£Όμ†Œ κ°’!

 

그럼 λ‹€μŒ μ½”λ“œκ°€ λ™μž‘ν• κΉŒ?

 

#include <assert.h>

int main() {
    int arr[] = {11, 22, 33, 44};

    int *pointer = arr;

    return 0;
}

 

κ·Έλ ‡λ‹€ μœ„μ˜ μ½”λ“œλŠ” μ „ν˜€ λ¬Έμ œκ°€ μ—†λŠ” μ½”λ“œμ΄λ©° 잘 λ™μž‘ν•  것이닀.

 

 

μ•„λ§ˆ λ©”λͺ¨λ¦¬ μ–΄λ”˜κ°€μ— μœ„μ™€ 같은 ν˜•νƒœλ‘œ μ‘΄μž¬ν•  것이며 이게 λ°”λ‘œ 배열을 포인터 λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” 방법이닀.

 

ν¬μΈν„°λ‘œ λ°°μ—΄ μš”μ†Œ μ ‘κ·Όν•˜κΈ°

 

λ°°μ—΄μ—μ„œ νŠΉμ • μš”μ†Œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” 인덱슀λ₯Ό μ΄μš©ν•˜λŠ” 방법이 κ°€μž₯ ν”ν•˜λ‹€.

 

ν•˜μ§€λ§Œ 포인터λ₯Ό μ΄μš©ν•œλ‹€λ©΄ 포인터와 μ •μˆ˜λ₯Ό 적절히 μ‘°μž‘ν•˜μ—¬ μ ‘κ·Ό ν•˜λŠ” 방식도 μ‘΄μž¬ν•œλ‹€.

 

κ·Έ 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ λ‹€μŒ μ½”λ“œλ₯Ό μ•Œμ•„λ³΄μž.

 

#include <stdio.h>

int main() {
    int arr[] = {11, 22, 33, 44};

    int *pointer = arr;

    printf("%010x", pointer + 0);
    printf("%010x", pointer + 1);
    printf("%010x", pointer + 2);
    printf("%010x", pointer + 3);

    return 0;
}

 

μœ„μ˜ μ½”λ“œμ—μ„œ pointer + 1 이 μ˜λ―Έν•˜λŠ” 것은 λ¬΄μ—‡μΌκΉŒ?

 

(pointer + μ •μˆ˜) 의 의미

 

pointer λ³€μˆ˜μ— μ •μˆ˜λ₯Ό λ”ν•œλ‹€λŠ” 것은 포인터 λ³€μˆ˜μ˜ 데이터 νƒ€μž…λ§ŒνΌμ˜ byte λ₯Ό λ”ν•œλ‹€λŠ” μ˜λ―Έκ°€ λœλ‹€.

 

이 말은 무엇이냐?

 

즉 λ‹€μŒκ³Ό κ°™λ‹€λŠ” μ†Œλ¦¬μ΄λ‹€.

 

  • pointer + 0
    • pointer λ³€μˆ˜κ°€ 가리킀고 μžˆλŠ” μ£Όμ†Œ 값에 0byte λ§ŒνΌμ„ λ”ν•œ μ£Όμ†Œ
  • pointer + 1
    • pointer λ³€μˆ˜κ°€ 가리킀고 μžˆλŠ” μ£Όμ†Œ 값에 4byte λ§ŒνΌμ„ λ”ν•œ μ£Όμ†Œ
  • pointer + 2
    • pointer λ³€μˆ˜κ°€ 가리킀고 μžˆλŠ” μ£Όμ†Œ 값에 8byte λ§ŒνΌμ„ λ”ν•œ μ£Όμ†Œ

 

μ™œ 4 λ°”μ΄νŠΈμ”© μ¦κ°€ν• κΉŒ?

 

μ΄μœ λŠ” λ°”λ‘œ pointer λ³€μˆ˜κ°€ ν• λ‹Ήλœ 데이터 νƒ€μž…μ΄ integer νƒ€μž…μ΄λΌ κ·Έλ ‡λ‹€.

 

그럼 μœ„μ˜ μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 ν˜•νƒœμ˜ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό κ°–κ²Œ λœλ‹€

 

 

ν¬μΈν„°λ‘œ μ ‘κ·Όν•œ λ°°μ—΄ μš”μ†Œμ˜ κ°’ κ°€μ Έμ˜€κΈ°

 

μ§€λ‚œ μ‹œκ°„μ— 포인터λ₯Ό μ΄μš©ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ°Έμ‘° μ—°μ‚°μž * 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€.

 

μ°Έμ‘° μ—°μ‚°μžκ°€ λ§Œμ•½ λ³€μˆ˜λͺ… μ•žμ— μ‚¬μš©λœλ‹€λ©΄ ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ— μ‘΄μž¬ν•˜λŠ” 값을 λ°˜ν™˜ ν•œλ‹€κ³  ν–ˆμœΌλ‹ˆ μš°λ¦¬λŠ” μ°Έμ‘° μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ λ°°μ—΄μ˜ λͺ¨λ“  값을 μ·¨ν•  수 있게 λ˜μ—ˆλ‹€.

 

#include <stdio.h>

int main() {
    int arr[] = {11, 22, 33, 44};

    int *pointer = arr;

    printf("%d", *pointer); // pointer κ°€ κ°€λ¦¬ν‚€λŠ” arr 의 μ£Όμ†Œμ˜ 첫 번째 μš”μ†Œμ˜ 값인 11 이 좜λ ₯됨

    return 0;
}

 

μš°λ¦¬λŠ” μ•žμ„œμ„œ (pointer + μ •μˆ˜) 의 의미λ₯Ό μ΄μš©ν•΄μ„œ λͺ¨λ“  λ°°μ—΄ μš”μ†Œμ˜ 값에 μ ‘κ·Όν•  수 있게 λœλ‹€.

 

μ£Όμ˜ν•˜μž

 

μš°λ¦¬λŠ” pointer + μ •μˆ˜ λ₯Ό μ΄μš©ν•΄μ„œ λͺ¨λ“  λ°°μ—΄ μš”μ†Œμ˜ 값에 μ ‘κ·Όν•  수 μžˆλ‹€κ³  ν–ˆλŠ”λ°, pointer + μ •μˆ˜ κ°€ μ»΄νŒŒμΌλŸ¬μ—κ²Œ λͺ…ν™•ν•˜κ²Œ μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©΄!

 

즉 κ΄„ν˜Έλ‘œ μ μ ˆν•˜κ²Œ λ¬Άμ§€ μ•ŠμœΌλ©΄ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

 

*pointer + 1 κ³Ό *(pointer + 1) 은 μ•„μ£Ό 큰 차이가 μžˆλ‹€λŠ” μ†Œλ¦¬λ‹€.

  • *pointer + 1
    • pointer λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œμ˜ 값에 μ •μˆ˜ 1을 λ”ν•œ κ°’
  • *(pointer + 1)
    • pointer λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” μ£Όμ†Œμ—μ„œ 4byte 만큼 μ΄λ™ν•œ μ£Όμ†Œμ— μ €μž₯된 κ°’

 

κ·Έλž˜μ„œ μš°λ¦¬κ°€ μ•žμ„œ 배운 (pointer + μ •μˆ˜)의 κ°œλ…κ³Ό * μ—°μ‚°μžμ˜ κ°œλ…μ„ λͺ¨λ‘ μ μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό 이해할 수 있게 λœλ‹€.

 

#include <assert.h>

int main() {
    int arr[] = {11, 22, 33, 44};

    int *pointer = arr;

    assert(arr[0] == *pointer);

    assert(&arr[0] == (pointer + 0));
    assert(arr[0] == *(pointer + 0));

    assert(&arr[1] == (pointer + 1));
    assert(arr[1] == *(pointer + 1));

    assert(&arr[2] == (pointer + 2));
    assert(arr[2] == *(pointer + 2));

    assert(&arr[3] == (pointer + 3));
    assert(arr[3] == *(pointer + 3));

    return 0;
}