c & c++

[C] 포인터, malloc()

쑰밈밍 2022. 9. 16. 04:13

πŸ’‘ 포인터

: μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜

: 포인터 λ³€μˆ˜λŠ” μžλ£Œν˜•μ— 상관 없이 λ©”λͺ¨λ¦¬ 크기가 μ–Έμ œλ‚˜ λ™μΌν•˜λ‹€. <- λͺ¨λ‘ 4λ°”μ΄νŠΈ

cf) 집이 μž‘λ“  크든 μ£Όμ†Œμ˜ ν˜•νƒœλŠ” λ™μΌν•˜λ‹€.

ex) 숫자, 문자 μ €μž₯ -> λ³€μˆ˜ μ„ μ–Έ

      μ–΄λ–€ λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œ μ €μž₯ -> 포인터 λ³€μˆ˜ μ„ μ–Έ

❗ μ£Όμ†Œ μ—°μ‚°μž &

ν•΄λ‹Ή λ³€μˆ˜μ˜ μ£Όμ†Œ => &λ³€μˆ˜λͺ…

* μ‹€μ œ λ³€μˆ˜μ˜ μ£Όμ†Œ 104== &λ³€μˆ˜λͺ… λ™μΌν•˜λ‹€.

❗  <μ—­μ°Έμ‘°> κ°€λ¦¬ν‚€λŠ” λŒ€μƒ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. 즉, λŒ€μƒ λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆλ‹€.

=> 포인터 λ³€μˆ˜λ₯Ό 톡해 κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ˜ 값을 μ„€μ • ν•  수 μžˆλ‹€.

❗ ν•¨μˆ˜μ™€ ν•¨μˆ˜ 사이에 값을 주고받을 λ•Œ 포인터λ₯Ό μ‚¬μš©ν•΄ μ£Όμ†Œ 값을 μ „λ‹¬ν•˜λ©΄ λ³€μˆ˜μ˜ μ£Όμ†Œκ°€ μ „λ‹¬λœλ‹€.

=> μ£Όμ†Œλ₯Ό 전달받은 ν•¨μˆ˜ μ•ˆμ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 곳의 λ³€μˆ˜ 값을 λ³€κ²½ν•  수 μžˆλ‹€.

 

πŸ’‘ μ‚¬μš©

1. 포인터 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ μž ν•  λ•Œ

2. μ—­μ°Έμ‘°λ₯Ό ν•  λ•Œ μ‚¬μš©.

 

: μ •μˆ˜ν˜• μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜ b μ„ μ–Έ => int *b;

ex) int* b = &λ³€μˆ˜λͺ…(104λ²ˆμ§€); 

     : bκ°€ 104λ²ˆμ§€μ˜ λ³€μˆ˜λ₯Ό 가리킀고 μžˆλ‹€.

❗ κ°„μ ‘ μ—°μ‚°μž *

: *포인터 λ³€μˆ˜λ₯Ό 톡해 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ˜ 값을 μ„€μ • ν•  수 μžˆλ‹€.

#include <stdio.h>

int main() {

	int a = 10;
	printf("a >> %d\n", a);	// 10
	int* b = &a;
	*b = 20;
	printf("a >> %d\n", a);	// 20

	return 0;
}

 

πŸ’‘ μ‚¬μš©μ΄μœ 

❗ 값에 μ˜ν•œ 호좜 Call by Value

: ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•˜λ©΄μ„œ 값을 μ „λ‹¬ν•˜λŠ” 방식

: main() -> a() -> main() ν•¨μˆ˜λ‘œ λ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λ©΄μ„œ λ³€μˆ˜μ˜ 값이 λ³΅μ‚¬λœλ‹€. 

, ν•¨μˆ˜λŠ” 각각 λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ λ‹€λ₯΄λ―€λ‘œ μ„œλ‘œμ—κ²Œ 영ν–₯을 쀄 수 μ—†λ‹€.

=> ν•¨μˆ˜ ν˜ΈμΆœμ‹œ μ£Όμ†Œλ₯Ό 전달해 λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•  수 μžˆλ„λ‘ ν•œλ‹€.

=> μ£Όμ†Œλ₯Ό λ„˜κ²¨μ€€κ²ƒμ΄κΈ° λ•Œλ¬Έμ— μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” 포인터 λ³€μˆ˜λ₯Ό μ΄μš©ν•΄μ•Όν•œλ‹€.

❗ μ£Όμ†Œμ— μ˜ν•œ 호좜 Call by Address

: ν•¨μˆ˜μ—μ„œ 값이 μ•„λ‹Œ μ£Όμ†Œλ₯Ό λ‹€λ₯Έ ν•¨μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 방식

 

πŸ’‘ 포인터 λ°°μ—΄

: λ©”λͺ¨λ¦¬ 방의 μ£Όμ†ŒλŠ” 1. 숫자둜 2. λ°°μ—΄ μ΄λ¦„μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

ex) &a[0] μ£Όμ†Œμ—°μ‚°μž μ‚¬μš©κ°€λŠ₯

: λ°°μ—΄μ˜ 이름 == &λ°°μ—΄λͺ…[0] => λ°°μ—΄μ˜ μ΄λ¦„μ΄μž λ°°μ—΄μ˜ 첫번째 μ£Όμ†Œ

: 포인터λ₯Ό μ΄μš©ν•΄ 첫번째 μ£Όμ†Œ 뿐만 μ•„λ‹ˆλΌ 배열을 어디든지 κ°€λ¦¬ν‚€κ²Œ ν•  수 μžˆλ‹€.

=> ν¬μΈν„° μ£Όμ†Œ κ°’ μ—°μ‚° +1은 증가가 μ•„λ‹ˆλΌ λ°°μ—΄ ν•œ μΉΈ λ°”μ΄νŠΈ 크기λ₯Ό 의미.

: 포인터도 λ³€μˆ˜λ‹€, λ³€μˆ˜λŠ” λ°°μ—΄λ‘œ ꡬ성할 수 μžˆλ‹€.

ex) int* a[2];

: λ¬Έμžμ—΄ μ²˜λ¦¬ν•  λ•Œ 자주 μ‚¬μš©

 

πŸ’‘ ν¬μΈν„°μ˜ 포인터 **

: 포인터 λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ 

 

πŸ’‘ λ¬Έμžμ—΄ μ €μž₯

1. 문자 λ°°μ—΄ 이용 char a[10] = "Hello";

2. 문자 μžλ£Œν˜• 포인터 λ³€μˆ˜ 이용 char* a = "Hello";

=> 포인터 λ³€μˆ˜λŠ” λ°˜ν™˜λ˜λŠ” μ£Όμ†Œλ₯Ό ν• λ‹Ή λ°›μ•„ λ¬Έμžμ—΄μ΄ μ €μž₯된 μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” 것

3. 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή

 

πŸ’‘ 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή

: κ·Έλ•Œ κ·Έλ•Œ 상황에 따라 λ³€κ²½ κ°€λŠ₯ν•œ.

: μ •μ μœΌλ‘œ 미리 μ •ν•΄μ Έ μžˆμ§€ μ•Šκ³ , λ™μ μœΌλ‘œ κ²°μ •λœλ‹€.

== 즉 μ½”λ“œκ°€ μˆ˜ν–‰λ˜λ©΄μ„œ 상황에 따라 κ·Έλ•Œ κ·Έλ•Œ ν•„μš”ν•œ 크기만큼 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›μ•„ μ‚¬μš©ν•œλ‹€.

: malloc() ν•¨μˆ˜κ°€ λλ‚˜ main() ν•¨μˆ˜λ‘œ λ„˜μ–΄κ°€λ„ μ €μž₯된 λ©”λͺ¨λ¦¬λŠ” 사라지지 μ•ŠλŠ”λ‹€.

❗ malloc() ν•¨μˆ˜μ΄μš© + free(포인터 λ³€μˆ˜)

: #include <stdlib.h> ν—€λ”νŒŒμΌ

: μ›ν•˜λŠ” λ°”μ΄νŠΈ 수만큼 λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ή λ°›λŠ”λ‹€.

: κ²°κ³Ό κ°’μœΌλ‘œ ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό λ°˜ν™˜. == ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ 곳에 결과둜 ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€.

❗ free(포인터 λ³€μˆ˜)

: ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬ μ‚¬μš© ν›„ malloc() ν•¨μˆ˜λ‘œ ν• λ‹Ή 받은 λ©”λͺ¨λ¦¬λ₯Ό μ‹œμŠ€ν…œμ— λ°˜ν™˜ν•œλ‹€.