C++/포인터 (Pointers)

[C++] λ°°μ—΄κ³Ό ν¬μΈν„°μ˜ 관계 (Relationship Between Arrays and Pointers)

Chan Lee 2023. 12. 19. 22:59

λ°°μ—΄κ³Ό ν¬μΈν„°μ˜ 관계: Relationship Between Arrays and Pointers

 

λ°°μ—΄κ³Ό 포인터λ₯Ό λ‘˜ λ‹€ μ–ΌμΆ” μ΄ν•΄ν•˜κ²Œ 되면, ν•œκ°€μ§€ 곡톡점을 μ•Œκ²Œ λ©λ‹ˆλ‹€.

λ°°μ—΄μ˜ 이름이 μ–΄λ–€ 것을 μ˜λ―Έν•˜λŠ”μ§€ κΈ°μ–΅ν•˜κ³  κ³„μ‹œλ‚˜μš”?

λ°”λ‘œ 'λ°°μ—΄μ˜ 첫번째 λ°μ΄ν„°μ˜ μ£Όμ†Œκ°’'을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

 

그리고, 포인터 λ³€μˆ˜μ˜ 값은 μ£Όμ†Œκ°’μ΄μ˜€μŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 보면 사싀상 λ°°μ—΄μ˜ 이름과 ν¬μΈν„°λŠ” λ™μΌν•œ 것 같지 μ•Šλ‚˜μš”?

 

μ‹€μ œλ‘œ λ§Œμ•½ 포인터가 λ°°μ—΄μ˜ μš”μ†Œμ™€ λ™μΌν•œ νƒ€μž…μ„ 가지고 μžˆλ‹€λ©΄, 

포인터와 배열은 μƒν˜Έκ΅ν™˜μ μœΌλ‘œ, (사싀상) λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°„λ‹¨ν•œ μ½”λ“œλ‘œ 이λ₯Ό 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

int scores[]{100, 90, 80};

cout << "Print scores: " << scores << endl; // 0x16f11b138 (μ£Όμ†Œ)
cout << "Print *scores: " << *scores << endl; // 100

int *score_ptr{scores};
cout << "Print score_ptr: " << score_ptr << endl; // 0x16f11b138 (μ£Όμ†Œ)
cout << "Print *score_ptr: " << *score_ptr << endl; // 100

λ°°μ—΄μ˜ 이름 scores와 score_ptr 포인터가 λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

각 μš”μ†Œμ—λ„ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλŠ”μ§€ ν™•μΈν•΄λ³ΌκΉŒμš”?

int scores[]{100, 90, 80};

int *score_ptr{scores};

cout << score_ptr[0] << endl; // 100
cout << scores[0] << endl;  // 100

cout << score_ptr[1] << endl; // 90
cout << scores[1] << endl;  // 90

cout << score_ptr[2] << endl; // 80
cout << scores[2] << endl;  // 80

μ •ν™•ν•˜κ²Œ λ™μΌν•œ λ°©λ²•μœΌλ‘œ ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

  cout << *score_ptr << endl; // 100
  cout << *(score_ptr + 1) << endl; // 90
  cout << *(score_ptr + 2) << endl; // 80

이런 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

이게 μ–΄λ–»κ²Œ κ°€λŠ₯ν•œμ§€λŠ” 제 포슀트 쀑 배열에 κ΄€λ ¨λœ ν¬μŠ€νŠΈμ—μ„œ λŒ€λž΅ μ†Œκ°œκ°€ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

[C++] λ°°μ—΄ (Array)

Modern C++μ—μ„œλŠ” 주둜 λ°°μ—΄λ³΄λ‹€λŠ” 벑터λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. λ°°μ—΄μ—λŠ” μ—¬λŸ¬κ°€μ§€ νŠΉμ§•μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ νŠΉμ§• μ—¬λŸ¬κ°€μ§€λ₯Ό μ†Œκ°œν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. 1. λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ“€μ€ 같은 데이터 νƒ€μž…μ΄μ—¬μ•Ό

code-studies.tistory.com

 

미리보기 사진이 κ΄€λ ¨λœ μ„€λͺ… λΆ€λΆ„μž…λ‹ˆλ‹€.

 

sizeof(int) = 4 μ΄λ―€λ‘œ, μ •μˆ˜ λ°°μ—΄μ˜ 각 μš”μ†ŒμΈ μ •μˆ˜ ν•˜λ‚˜ λ‹Ή 4의 λ°”μ΄νŠΈλ₯Ό μ°¨μ§€ν•©λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλ„ 같은 κ°œλ…μ΄ μ μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

*score_ptr = score_ptr 의 μ£Όμ†Œ = scores λ°°μ—΄μ˜ 첫번째 κ°’ (100) 의 μ£Όμ†Œ μž…λ‹ˆλ‹€.

이λ₯Ό 0x16...10 이라고 κ°€μ •ν–ˆμ„ λ•Œ,

*(score_ptr + 1) = 0x16...10 + 4 = 0x...14

*(score_ptr + 2) = 0x16...10 + 4 + 4 = 0x...18

*(score_ptr + 3) = 0x16...10 + 4 + 4 + 4 = 0x...22

...

이런 μ‹μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.

 

asteriskλ₯Ό λ–Όκ³  μ§μ ‘μ μœΌλ‘œ μ£Όμ†Œλ₯Ό ν•œλ²ˆ μ½μ–΄λ³ΌκΉŒμš”?

  int scores[]{100, 90, 80, 70};
  int *score_ptr{scores};

  cout << score_ptr << endl;  // 0x16b00f130
  cout << (score_ptr + 1) << endl;  // 0x16b00f134
  cout << (score_ptr + 2) << endl;  // 0x16b00f138

0x16...30, 0x16...34, 0x16...38

둜 4μ”© μ¦κ°€ν•˜λŠ”κ²Œ 보이싀 κ²λ‹ˆλ‹€.

 

즉, ν•˜λ‚˜μ˜ ν‘œν˜„μœΌλ‘œ μ •λ¦¬ν•˜μžλ©΄

array_name λ°°μ—΄κ³Ό κ·Έ 배열을 κ°€λ₯΄ν‚€λŠ” pointer_name ν¬μΈν„°μ— λŒ€ν•΄μ„œ,

array_name[index] = *(array_name + index)

pointer_name[index] = *(pointer_name + index)

μž…λ‹ˆλ‹€.