π’ chap2. μμ€ μ½λμμ μ΄μ§ νμΌλ‘
β 2.1 νμ€ μ»΄νμΌ νμ΄νλΌμΈ
λ€ κ°μ§ μμλ‘ κ΅¬μ±λ νμ΄νλΌμΈ
- μ μ²λ¦¬κΈ°
- μ»΄νμΌλ¬
- μ΄μ λΈλ¬
- λ§μ»€
- νμ΄νλΌμΈ λ΄λΆμ κ° μ»΄ν¬λνΈλ μ΄μ μμλ‘λΆν° νΉμ ν μ λ ₯κ°μ λ°κ³ , λ€μ μ»΄ν¬λνΈλ₯Ό μν νΉμ κ²°κ΄κ°μ μμ±ν©λλ€.
- μ»΄ν¬λνΈ μ€ μ΄λ μμ ν λ¨κ³λΌλ μ€ν¨νλ€λ©΄ μ΄λ μ»΄νμΌ μ€ν¨ λλ λ§ν¬ μ€ν¨λ‘ μ΄μ΄μ§κ³ , κ·Έμ κ΄λ ¨λ μ€λ₯ λ©μμ§κ° λ±μ₯ν©λλ€.
- μ¬λ°°μΉ κ°λ₯ν λͺ©μ νμΌκ³Ό κ°μ μ΄λ€ μ€κ° κ²°κ³Όλ¬Όμ μμ€νμΌ νλκ° μΈ κ°μ§ μμ(μ μ²λ¦¬κΈ°, μ»΄νμΌλ¬, μ΄μ λΈλ¬)λ§ μ±κ³΅μ μΌλ‘ ν΅κ³Όνλ©΄ λ§λ€μ΄μ§λλ€.
- λ§μ»€λ λ ν° κ²°κ³Όλ¬Όμ λ§λ€ λ μ¬μ©νλλ°, μ€ν κ°λ₯ν λͺ©μ νμΌμ΄λΌκ³ ν©λλ€. μμ€ νμΌμ λΉλνλ©΄ νλ λλ μ¬λ¬κ°μ λͺ©μ νμΌμ λ§λ€ μ μμ΅λλ€.
νλ«νΌ
νλμ¨μ΄μμ μ€νλλ μ΄μ체μ μ κ²°ν©.
- ν¬λ‘μ€ νλ«νΌμ μ΄μ κ°λ₯νμ μ°¨μ΄μ : ν¬λ‘μ€ νλ«νΌμ κ° νλ«νΌμ λ°λΌ λ€λ₯Έ μ΄μ§νμΌκ³Ό μΈμ€ν¨λ¬κ° μμ΅λλ€. μ΄μ κ°λ₯ν μννΈμ¨μ΄λ λͺ¨λ νλ«νΌμμ κ°μ μ΄μ§ νμΌκ³Ό μΈμ€ν¨λ¬λ₯Ό μ¬μ©ν©λλ€.
- gccμ clang κ°μ Cμ»΄νμΌλ¬λ ν¬λ‘μ€ νλ«νΌ, μλ°μ λ°μ΄νΈ μ½λλ μ΄μ κ°λ₯ν©λλ€.
- C/C++μ½λκ° μ΄μ κ°λ₯νλ€ ν¨μ μμ€ μ½λμ μ΄λ€ν λ³κ²½μ΄λ μμ μ κ±°μΉμ§ μκ³ μλ‘ λ€λ₯Έ νλ«νΌμμ μ»΄νμΌ ν μ μλ€λ λ§μ λλ€. κ·Έλ¬λ μ΅μ’ λͺ©μ νμΌμ μ΄μμ±μ΄ μλ€λ μλ―Έλ μλλλ€.
- ν¬λ‘μ€ νλ«νΌμ μ΄μ κ°λ₯νμ μ°¨μ΄μ : ν¬λ‘μ€ νλ«νΌμ κ° νλ«νΌμ λ°λΌ λ€λ₯Έ μ΄μ§νμΌκ³Ό μΈμ€ν¨λ¬κ° μμ΅λλ€. μ΄μ κ°λ₯ν μννΈμ¨μ΄λ λͺ¨λ νλ«νΌμμ κ°μ μ΄μ§ νμΌκ³Ό μΈμ€ν¨λ¬λ₯Ό μ¬μ©ν©λλ€.
2.1.1 νλ‘μ νΈ λΉλνκΈ°
βοΈ ν€λ νμΌ vs μμ€ νμΌ
- ν€λ νμΌ : νμ₯μκ° .hμΈ νμΌ
- μμ€ νμΌ : νμ₯μκ° .cμΈ νμΌ
ν€λ νμΌμ μ£Όλ‘ μ΄κ±°ν, 맀ν¬λ‘, νμ μ μ, ν¨μμ μ μΈ, μ μ λ³μ, ꡬ쑰체λ ν¬ν¨ν©λλ€. νλ‘κ·Έλλ° μμμ μ μΈμ νμΌμ μ 리ν΄λ‘λλ€.
β»μμ€ νμΌ μμ λ€λ₯Έ μμ€ νμΌμ ν¬ν¨νλ κ²μ μλͺ»λ κ²½μ°μ λλ€.
ν¨μ μ μΈμ λ°ννκ³Ό ν¨μ μκ·Έλμ²λ‘ ꡬμ±λ©λλ€.
1
dobule average(int*, int);
βοΈν¨μ μ μ
1
2
3
4
5
6
7
8
9
10
double average(int* array, int length){
if(length <= 0 ){
return 0;
}
double sum = 0.0;
for(int i = 0; i<length; i++){
sum += array[i];
}
return sum/ length;
}
μ€κ΄νΈλ‘ κ°μΈμΈ λͺΈμ²΄κ° μμΌλ©΄ μ μμ λλ€.
mainν¨μ
μμ€ νμΌ μ€ νλλ main ν¨μλ₯Ό ν¬ν¨νλλ°, νλ‘κ·Έλ¨μ μ§μ μ μ λλ€. mainν¨μ μμ΄λ νλ‘κ·Έλ¨μ μ€ν νμΌμ κ°μ§ μ μμ΅λλ€. μ»΄νμΌλ¬λ νλ‘κ·Έλ¨ μμμ μΌλ‘ mainμ μ°Ύμ΅λλ€.
μ λ°© μ μΈ
ν¨μλ₯Ό μ μνκΈ° μ΄μ μ ν¨μλ₯Ό μ μΈνλ νμ
ν€λ κ°λλ¬Έ
ν€λ νμΌμ΄ μ»΄νμΌ λ λ λ λ² λλ κ·Έ μ΄μ ν¬ν¨λλ κ²μ λ°©μ§ν©λλ€.
- κ·μΉ 1 : μμ€ νμΌλ§ μ»΄νμΌ, ν€λνμΌμ μ»΄νμΌ νμ§ μλλ€.
- κ·μΉ 2 : κ° μμ€ νμΌμ λ°λ‘λ°λ‘ μ»΄νμΌ ν©λλ€., ν λ²μ μ¬λ¬ νμΌμ μ»΄νμΌ νμ§ μμ΅λλ€.
βοΈ 2.1.2 1λ¨κ³ : μ μ²λ¦¬
1
2
3
4
5
6
7
8
μ»΄νμΌ νμ΄νλΌμΈμ 첫 λ¨κ³ : μ μ²λ¦¬ μ
λλ€. μ»΄νμΌμ΄ μμλκΈ° μ μ μ μ²λ¦¬κΈ°κ° ν€λ νμΌμ λ΄μ©μ λͺ¨μμ νλμ Cμ½λ λͺΈμ²΄λ‘ λ§λλλ€. κ·Έλ¦¬κ³ , μ μ²λ¦¬κΈ° μ§μμ(#include, #defineλ±)λ μ΄ λ¨κ³μμ λ°λμ ν΄κ²°λμ΄μΌ ν©λλ€. μ μ²λ¦¬λ μ½λλ λ³νλ¨μλΌκ³ ν©λλ€. λ³νλ¨μλ μ»΄νμΌ λ¨μλΌκ³ λ ν©λλ€.
```c
$ gcc -E ExtremeC_examples_chapter2_1.c
λ³νλ¨μ μμ±
```
μ
λ ₯κ° : μμ€ νμΌ, μΆλ ₯κ° : λ³νλ¨μ
2.1.3 2λ¨κ³ : μ»΄νμΌ
μ λ ₯κ°: λ³νλ¨μ, μΆλ ₯κ°: μ΄μ λΈλ¦¬ μ½λ
μ»΄νμΌλ¬λ λ³νλ¨μλ₯Ό ꡬ문 λΆμparseνκ³ μ΄λ₯Ό λμ μν€ν μ²μ λ§λ μ΄μ λΈλ¦¬ μ½λλ‘ λ³νν©λλ€.
λμ μν€ν μ²(νΈμ€νΈ μν€ν μ²) : νλ‘κ·Έλ¨μ΄ μ»΄νμΌλμ΄ μ€νλ νλμ¨μ΄λ CPUλ₯Ό λ»ν©λλ€.
1 2 3
$ gcc -S ExtermeC_examples_chapter2_1.c $ cat ExtemreC_examples_chapter2_1.s μ»΄νμΌ μ΄ν 보μ¬μ§ μ΄μ λΈλ¦¬ μ½λ P107
λμ μν€ν μ² : μμ€ νμΌμ΄ μ»΄νμΌλμ΄ μ€νλ μν€ν μ²
λΉλ μν€ν μ² : μμ€λ₯Ό μ»΄νμΌ ν λ μ¬μ©νλ μν€ν μ²
μλ₯Ό λ€μ΄ : ARM 32 λΉνΈ λ¨Έμ (λΉλμν€ν μ²)μμ AMD 64λΉνΈ νλμ¨μ΄(λμ μν€ν μ²)λ₯Ό μν Cμμ€λ₯Ό μ»΄νμΌ ν μ μμ΅λλ€.
2.1.4 3λ¨κ³: μ΄μ λΈλ¦¬
μ λ ₯κ° : μ΄μ λΈλ¦¬ μ½λ μΆλ ₯κ° : μ¬λ°°μΉ κ°λ₯ ν λͺ©μ νμΌ ( κΈ°κ³μ΄ μ½λ, μ€κ° λͺ©μ νμΌ)
λͺ©μ νμΌ : κΈ°κ³ μμ€μ λͺ λ Ήμ΄λ₯Ό ν¬ν¨νλ νμΌμ λͺ©μ νμΌ μ΄λΌνλ€.
μ΄μ§ νμΌ λλ λͺ©μ νμΌ κΈ°κ³ μμ€μ λͺ λ Ήμ΄λ₯Ό ν¬ν¨νλ νμΌμ κ°λ¦¬ν€λ μλ‘ κ°μ λ§μ΄λ€.
μ λμ€ κ³μ΄ μ΄μ체μ μμ μ΄μ λΈλ¬ λꡬλ asμ λλ€.
1 2
$ as ExtemreC_examples_chapter2_1.s -o ExtemreC_examples_chapter2_1.o $
μ΄μ λΈλ¦¬μ½λλ‘ λͺ©μ νμΌμ μμ±
μ¬λ°°μΉ κ°λ₯ν λͺ©μ νμΌμ .oνμ₯μ(μλμ°μμλ .obj)μ λΆμ λλ€.
μ»΄νμΌλ¬λ‘ -cμ΅μ μ μ λ¬νλ€λ©΄ μ μ²λ¦¬, μ»΄νμΌ, μ΄μ λΈλ¦¬λ₯Ό νλ²μ μνν©λλ€.
λΉλλ 4λ¨κ³(μ μ²λ¦¬, μ»΄νμΌ, μ΄μ λΈλ¦¬, λ§ν¬)λ₯Ό μλ―Έν©λλ€.
1 2 3
$ gcc -c ExtremeC_examples_chapter2_1.c -o impl.o $ gcc -c ExtremeC_examples_chapter2_1_main.c -o main.o $
μμ€νμΌμμ μ¬λ°°μΉ κ°λ₯ν λͺ©μ νμΌ μμ±
2.1.5 4λ¨κ³: λ§ν¬
μ λ ₯κ° : λͺ©μ νμΌ κ²°κ³Όκ° : μ€ννμΌ
μλ‘μ΄ μν€ν μ²λ₯Ό μν νλ‘κ·Έλ¨μ 2κ°μ§ 쑰건μ μΆ©μ‘±νλ©΄ λΉλ ν μ μμ΅λλ€.
- μ΄μ λΈλ¦¬μ΄κ° μλ €μ Έ μμ΅λλ€.
- μ μ‘°μ¬μ μν΄ κ°λ°λ νμ μ΄μ λΈλ¬ λκ΅¬κ° μμ΄μΌ ν©λλ€. μ΄λ₯Ό μ¬μ©ν΄ μ΄μ λΈλ¦¬ μ½λλ₯Ό κ·Έμ ν΄λΉνλ κΈ°κ³μ΄ μμ€ λͺ λ Ήμ΄λ‘ λ³νν μ μμ΅λλ€.
μ΄ λ μ‘°κ±΄μ΄ λ§μ‘±νλ©΄ μμ€ μ½λμμ κΈ°κ³μμ€μ λͺ λ Ήμ΄λ₯Ό μμ±ν μ μμ΅λλ€. κ·ΈλμΌ λͺ©μ νμΌ ν¬λ§·μ μ΄μ©ν΄ λͺ©μ νμΌ μμ κΈ°κ³ μμ€μ λͺ λ Ήμ΄λ₯Ό μ μ₯ν μ μμ΅λλ€. μλ₯Ό λ€λ©΄ ELFλλ Mach-OλΌλ ννκ° λ μ μμ΅λλ€.
κΈ°λ³Έλ§μ»€ ld μ¬μ©νκΈ°
1 2 3 4
$ ld impl.o main.o 113μͺ½ $ gcc impl.o main.o $ ./a.out
β 1.2 ν¬μΈν° λ³μ
1.2.1 λ¬Έλ²
ν¬μΈν°: λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ μ₯νλ λ¨μν λ³μ
μμ 1-9
1 2 3 4 5 6 7
int main(int argc, char** argv) { int var = 100; int* ptr = 0; ptr = &var; *ptr = 200; return 0; }
λ ν¬μΈν° μ μΈ, μ°Έμ‘° μ°μ°μ&, μμ°Έμ‘° μ°μ°μ*
NULL 맀ν¬λ‘ μ¬μ©: λ³μμ ν¬μΈν°λ₯Ό λ μ½κ² ꡬλΆ
1.2.2 ν¬μΈν° λ³μμ μ°μ μ°μ°
μ°μ μ°μ° κ°κ²©: ν¬μΈν°κ° 1μ© μ¦κ°ν λ μμ§μ΄λ λ°μ΄νΈμ μ«μ, C μλ£νμ μν΄ κ²°μ λ¨
μμ 1-10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include <stdio.h> int main(int argc, char** argv) { int var = 1; int* int_ptr = NULL; // ν¬μΈν°λ₯Ό λλ‘ λ§λ€κΈ° int_ptr = &var; char* char_ptr = NULL; char_ptr = (char*)&var; printf("Before arithmetic: int_ptr: %u, char_ptr: %u\n", (unsigned int)int_ptr, (unsigned int)char_ptr); int_ptr++; // μΌλ°μ μΌλ‘ μ°μ μ°μ° κ°κ²©μ 4λ°μ΄νΈ char_ptr++; // 1λ°μ΄νΈμ μ°μ μ°μ° κ°κ²© printf("After arithmetic: int_ptr: %u, char_ptr: %u\n", (unsigned int)int_ptr, (unsigned int)char_ptr); return 0; }
μ€ν κ²°κ³Ό μ μ ν¬μΈν°μ μ°μ° κ°κ²©μ 4λ°μ΄νΈ, λ¬Έμμ΄ ν¬μΈν°λ 1λ°μ΄νΈ
1.2.3 μ λ€λ¦ ν¬μΈν°
μ λ€λ¦ ν¬μΈν°: void* μλ£νμ ν¬μΈν°, μμ°Έμ‘° λΆκ°λ₯
μμ 1-13
1 2 3 4 5 6 7 8 9 10 11
#include <stdio.h> int main(int argc, char** argv) { int var = 9; int* ptr = &var; void* gptr = ptr; printf("%d\n", *gptr); return 0; }
μ λ€λ¦ ν¬μΈν°λ₯Ό μμ°Έμ‘°νλ©΄ μ»΄νμΌ μ€λ₯κ° μμ±λ¨
1.2.4 ν¬μΈν°μ ν¬κΈ°
μν€ν μ²μ λ°λΌ ν¬μΈν°μ ν¬κΈ°κ° λ€λ¦
λμ μν€ν μ²μμ sizeof ν¨μ μ¬μ©
1.2.5 νμ ν¬μΈν°
μΆ©λ λλ μΈκ·Έλ©ν μ΄μ μ€λ₯ λ°μ
μμ 1-15
1 2 3 4 5 6 7 8 9 10 11 12 13
#include <stdio.h> int* create_an_integer(int default_value) { int var = default_value; return &var; } int main() { int* ptr = NULL; ptr = create_an_integer(10); printf("%d\n", *ptr); return 0; }
μΈκ·Έλ©ν μ΄μ μ€λ₯ μν©, ptr ν¬μΈν°κ° ν λΉμ΄ ν΄μ λ varμ λ©λͺ¨λ¦¬ μμμ κ°λ¦¬ν΄(νμ ν¬μΈν°)
β 1.3 ν¨μ
βοΈ ν¨μμ ꡬ쑰
ν¨μ: μ΄λ¦κ³Ό μ λ ₯ 맀κ°λ³μμ λͺ©λ‘, μΆλ ₯ κ²°κ³Όμ λͺ©λ‘μ κ°μ§ λ Όλ¦¬ μμ
C μΈμ΄μμ ν¨μλ λ¨ νλμ κ°λ§μ λ°ν
λΈλ‘νΉ ν¨μ: νΈμΆλ ν¨μκ° μ’ λ£λμ΄μΌλ§ λ°νκ°μ νΈμΆμ ν¨μκ° λ°μ μ μμ
λ ΌλΈλ‘νΉ ν¨μ: μ½λ°± λ©μ»€λμ¦, λΉλκΈ° ν¨μ, μ¬κ±΄ κΈ°λ° νλ‘κ·Έλλ°(EDP)
βοΈ μ€κ³μ μ€μμ±
λ‘μ§μ μμ± ν λ€μν κ³³μμ μ¬λ¬ λ² μ¬μ© κ°λ₯
μΆμν: κΈ°μ‘΄μ λ€λ₯Έ λ‘μ§μΌλ‘λΆν° μΌλΆλ₯Ό μ¨κΉ
βοΈ μ€ν κ΄λ¦¬
μ€ν μΈκ·Έλ¨ΌνΈ β λͺ¨λ μ§μ λ³μ, λ°°μ΄, κ΅¬μ‘°μ²΄κ° ν λΉλλ κΈ°λ³Έ λ©λͺ¨λ¦¬μ μμΉ.
μ€ν νλ μ β μ€ν μΈκ·Έλ¨ΌνΈμ κ°μ₯ μμ λμ΄κ³ , ν¨μ λ‘μ§μ΄ μ€νλ©λλ€. νΈμΆμ΄ λλλ©΄ μ€ν νλ μμ μ κ±°λλ©° μ§μ νΈμΆ ν¨μλ‘ κ³μ μ΄μ΄μ§λλ€.
μ€ν νλ μ μμ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int main() { func1(); } void func1() { func2(); } void func2() { }
μ€ν μ€λ²νλ‘ β μ€νμμλ λ©λͺ¨λ¦¬κ° νμ μ μ λλ€. νμ§λ§ ν¨μ νΈμΆμ λ무 λ§μ΄ μ€νν΄ μ€ν νλ μμ λͺ¨λ μ€ν μΈκ·Έλ¨ΌνΈλ₯Ό λ€ μ¨λ²λ¦° κ²½μ°μ λ°μν©λλ€.
βοΈ κ°μ μν μ λ¬ vs μ°Έμ‘°μ μν μ λ¬
Cμλ μ°Έμ‘°κ° μμ΄, μ°Έμ‘°μ μν μ λ¬μ μ‘΄μ¬νμ§ μμ΅λλ€.
μ€λ‘μ§ κ°μ μν μ λ¬λ§ μ‘΄μ¬ν©λλ€.
κ°μ μν μ λ¬ ν¨μ νΈμΆμ μ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> void swap(int, int); int main(void) { int a = 5, b = 3; printf("before) a = %d, b = %d\n", a, b); swap(a, b); printf("after) a= %d , b = %d\n", a, b); return 0; } void swap(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; printf("swap) a = %d , b = %d\n", num1, num2); } /****************************************************** before) a = 5, b = 3 swap) a = 3 , b = 5 after) a= 5 , b = 3 *******************************************************/
ν¬μΈν°λ₯Ό λ³μλ‘ μ λ¬νλ κ²μ΄ ν¬μΈν°μ μν μ λ¬μ λλ€.
ν¬μΈν°μ μν ν¨μ νΈμΆμ μ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> void func(int* a) { int b = 9; *a = 5; //ν¬μΈν° μμ°Έμ‘° a = &b; } int main(void) { int x = 3; int* xptr = &x; printf("the value before the call = %d \n", x); printf("pointer value before the call = %p\n", xptr); func(xptr); printf("the value after the call = %d \n", x); printf("pointer value after the call=%p \n", xptr); return 0; } /****************************************************** the value before the call = 3 pointer value before the call = 0000007032AFF624 the value after the call = 5 pointer value after the call=0000007032AFF624 *******************************************************/
μμ κ²°κ³Όλ₯Ό 보면 ν¬μΈν°μ κ°μ ν¨μ νΈμΆ μ΄νμλ λ³νμ§ μμ΅λλ€. μ΄λ ν¬μΈν°κ° κ°μ μν μ λ¬ μΈμλ‘ μ λ¬λμμμ μλ―Έν©λλ€. ν¬μΈν°λ₯Ό μμ°Έμ‘°νλ©΄ νΈμΆνλ μͺ½μ ν¨μμ λ³μλ₯Ό μμ ν μ μλλ‘ ν©λλ€.
β 1.4 ν¨μ ν¬μΈν°
βοΈ ν¨μ ν¬μΈν°
β ν¨μμ μ£Όμλ₯Ό μ μ₯νλ©° ν¨μλ₯Ό κ°μ μ μΌλ‘ νΈμΆν μ μλλ‘ κ΅¬νν©λλ€.
β μ΄λ‘μΈν΄ κ°κ°μ κΈ°λ₯λ€μ νμΌλ³λ‘ λλμ΄ λλ μμ μΈ λͺ¨λνκ° κ°λ₯ν΄ μ‘μ΅λλ€.
1 2 3 4 ν¨μ ν¬μΈν° λ³μ μ μΈ = int (*fptr) (int); int - ν΄λΉ ν¨μμ λ°νν (*fptr) - ν¬μΈν° λ³μ (int) - ν΄λΉν¨μμ 맀κ°λ³μμ νν
λ€λ₯Έ ν¨μ μ¬λ¬ κ°λ₯Ό νΈμΆνλ νλμ ν¨μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> int sum(int a, int b) // νμ λ³μΉμΌλ‘ ν΄λλ νΈμ΄ μ’μ΅λλ€. { return a + b; } int subtract(int a, int b) { return a - b; } int main() { int(*func_ptr)(int, int); func_ptr = NULL; // ν¨μ ν¬μΈν°λ NULLλ‘ μ΄κΈ°νλ₯Ό ν΄μ£Όμ΄μΌν©λλ€. func_ptr = ∑ int result = func_ptr(5, 4); printf("Sum = %d\n", result); func_ptr = &subtract; result = func_ptr(5, 4); printf("subtract = %d\n", result); return 0; } Sum = 9 subtract = 1
μ¬λ¬κ°μ λ€λ₯Έ ν¨μλ₯Ό νΈμΆνλ νλμ ν¨μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> typedef int bool_t; typedef bool_t(*less_than_func_t)(int, int); bool_t less_than(int a, int b) { return a < b ? 1 : 0; } bool_t less_than_modular(int a, int b) { return (a % 5) < (b % 5) ? 1 : 0; } int main(void) { less_than_func_t func_ptr = NULL; func_ptr = &less_than; bool_t result = func_ptr(3, 7); printf("%d\n", result); func_ptr = &less_than_modular; result = func_ptr(3, 7); printf("%d\n", result); return 0; } 1 0
β 1.5 ꡬ쑰체
βοΈ μ ꡬ쑰체μΈκ°?
β μμ μλ£ν (PDT) = μλ£κ΅¬μ‘°λ₯Ό μ€κ³ν μ μκ³ , μκ³ λ¦¬μ¦μ μμ± ν μ μμ΅λλ€.
ex) int, double
β μ¬μ©μ μ μ μλ£ν (UDT) = μ§μ μ μν μλ£νμ΄ νμνκ³ , νλ‘κ·Έλλ° μΈμ΄μ μλ£νμΌλ‘λ μΆ©λΆνμ§ μμ λ μ¬μ©ν©λλ€. struct ν€μλλ₯Ό μ¬μ©ν©λλ€.
ex) ꡬ쑰체
(ꡬ쑰체λ νλ μ΄μμ λ³μλ₯Ό νλλ‘ λ¬Άμ μ μλ λ³΅ν© μλ£νμ΄λ―λ‘ κΈ°λ³Έ μλ£ν λ³μλ₯Ό λ¬Άμ΄μ μλ‘μ΄ μλ£νμ λ§λ κ²μ΄κΈ° λλ¬Έμ μ¬μ©μ μ μ μλ£νμΌλ‘ ꡬλΆλ©λλ€.)
β λ€μν ννμ λ°μ΄ν°λ₯Ό μ²λ¦¬ν λ μ μ©ν©λλ€.
βοΈ μ μ¬μ©μ μ μ μλ£νμΈκ°?
κ°μ λμμ μλ‘ μ°κ΄λ μμ±μ κ·Έλ£ΉμΌλ‘ λ¬Άλκ²μ΄ κ°λ μ±μ΄ μ’μ΅λλ€. λ κ³ μμ€μ λ‘μ§, μΈκ° μμ€μ λ‘μ§κ³Ό μΆ©λΆν λΉμ·νκ² λ¬Έμ λ₯Ό λΆμνλ €λ©΄ μλ‘μ΄ μλ£νμ΄ νμν©λλ€.
ex) λΉμ¦λμ€ λ‘μ§ -μν(κ³ κ°, μκ³ , λ, νκΈ, μ§λΆ) κ°λ μ λ§μ£Όνκ³ , μν λ‘μ§μ κ°λ°νκΈ° μν΄μλ κ°λ°μμ λΉμ¦λμ€ λΆμκ°λ νλ ₯νλ©° κ·μΉ, λ‘μ§, μ©μ΄μ§λ±μ 곡μ ν΄μΌν©λλ€.
βοΈ κ΅¬μ‘°μ²΄μ μν
ꡬ쑰체λ νλμ ν΅ν©λ νμ μλ κ΄λ ¨λ κ°μ κ°μν ν©λλ€.
ex) color_t (red, green,blue)
1
2
3
4
5
struct color_t {
int red;
int green;
int blue;
};
β μλ‘μ΄ μλ£ν μλμ μλ‘ κ΄λ ¨μ΄ μλ νλλ₯Ό κ·Έλ£ΉμΌλ‘ λ¬Άλ μΊ‘μν ν©λλ€. κ·Έλ¦¬κ³ λμ νμν λ³μλ₯Ό μ μν λ μ΄ μλ‘μ΄ μλ£νμ μ¬μ©ν©λλ€.
βοΈ λ©λͺ¨λ¦¬ λ μ΄μμ
λ©λͺ¨λ¦¬ λ μ΄μμμ΄ νμν μ΄μ β κ°μ λ©λͺ¨λ¦¬μ μ μ₯λκ³ , cpuλ μ΄ κ°μ μΆ©λΆν λΉ λ₯΄κ² μ½κ³ μΈ μ μμ΄μΌ ν©λλ€.
ꡬ쑰체 λ³μμ ν λΉλ λ°μ΄νΈ μ μΆλ ₯νκΈ°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <stdio.h> struct sample_t { char first; char second; char third; short fourth; }; void print_size(struct sample_t* var) { printf("Size: %lu bytes\n", sizeof(*var)); } void print_bytes(struct sample_t* var) { unsigned char* ptr = (unsigned char*)var; for (int i = 0; i < sizeof(*var); i++, ptr++) { printf("%d ", (unsigned int)*ptr); } printf("\n"); } int main(int argc, char** argv) { struct sample_t var; var.first = 'A'; var.second = 'B'; var.third = 'C'; var.fourth = 765; print_size(&var); print_bytes(&var); return 0; } Size: 6 bytes 65 66 67 0 253 2
sizeof(sample_t)λ 6λ°μ΄νΈλ₯Ό λ°νν©λλ€.
- charν 3κ° shortν 1κ° μ΄ 5λ°μ΄νΈ μ λλ€. μ΄λ λ©λͺ¨λ¦¬ μ λ ¬μ μν΄ λ°μ΄νΈ 67λ€μ 0μ΄ λ³΄μ΄κ² ν©λλ€. 0λ°μ΄νΈλ νμ¬ μλ(cpuκ° λ©λͺ¨λ¦¬μ μ κ·Όν λ μ½λ νΉμ λ°μ΄νΈμ μ)λ₯Ό μμ±νκΈ° μν΄ μΆκ°λλ©°, λ€ λ²μ§Έ νλκ° λ€μ μλμμ μμν μ μλλ‘ ν©λλ€.
μ΄λ λ©λͺ¨λ¦¬ μ λ ¬μ΄λ μμνλ λ°μ΄νΈκ° μλμ μμμ μ μμ λ, μ΄ λ³μλ λ©λͺ¨λ¦¬μ μ λ ¬ λμλ€κ³ ν©λλ€.
1 2 3 4
ex) charνμΈ first, second, thirdλ κ°κ° 1λ°μ΄νΈμ΄λ©° μ΄λ€μ ꡬ쑰체 λ μ΄μμμ 첫λ²μ§Έ μλμ νμ¬ λ©λλ€. μ΄ν fouth λ 2λ°μ΄νΈ μ λλ€. λ§μΌ λ©λͺ¨λ¦¬ μ λ ¬μ΄ λμ§ μλλ€λ©΄ 첫λ²μ§Έ λ°μ΄νΈλ 첫λ²μ§Έ μλμ λ§μ§λ§ λ°μ΄νΈκ° λκ² λ©λλ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μ²«λ²μ§Έ μλλ 0λ°μ΄νΈ νλκ° ν¨νΉ(λ©λͺ¨λ¦¬ κ°μ μ λ ¬)λμ΄ μλ€κ³ ν μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ μ λ ¬μ κΈ°λ³Έμ μΌλ‘ νμ±νκ° λμ΄ μμ΅λλ€.
βοΈ μ€μ²© ꡬ쑰체
λ³΅ν© μλ£ν = μ¬μ©μ μ μ μλ£νμ΄κ³ , λͺ κ°μ ꡬ쑰체λ₯Ό μ€μ²©ν κ²°κ³Όμ λλ€.
λͺκ°μ§ μ€μ²© ꡬ쑰체
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <stdio.h> typedef struct { int x; //4byte int y; //4byte }point_t; //8byte typedef struct { point_t center; //8byte int radius; //4byte }circle_t; //12byte typedef struct { point_t start; //8byte point_t end; //8byte }line_t; //16byte
3κ°μ κ΅¬μ‘°μ²΄μΈ point_tμ circle_t, line_tκ° μ‘΄μ¬ν©λλ€.
point_t ꡬ쑰체λ μ€μ§ μμμλ£νμΌλ‘λ§ κ΅¬μ±λ λ¨μν μ¬μ©μ μ μ μλ£νμ΄μ§λ§
λ€λ₯Έ ꡬ쑰체λ€μ point_t μλ£νμ λ³μλ₯Ό ν¬ν¨ν λ³΅ν© μ¬μ©μ μ μ μλ£νμ λλ€.
βοΈ κ΅¬μ‘°μ²΄ ν¬μΈν°
β μ¬μ©μ μ μ μλ£νμ ν¬μΈν°λ μμ μλ£νμ ν¬μΈν°μ λμΌν©λλ€.
β ꡬ쑰체 λ³μ ν¬μΈν°κ° ꡬ쑰체 λ³μμ 첫 λ²μ§Έ νλμ μ£Όμλ₯Ό κ°λ₯΄ν΅λλ€.
λ©λͺ¨λ¦¬μμ λμΌν λ°μ΄νΈ μ£Όμλ₯Ό κ°λ¦¬ν€λ μΈ κ°μ§ μλ£νμΌλ‘λΆν° μ»λ 3κ°μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include <stdio.h> typedef struct { int x; int y; }point_t; typedef struct { point_t center; int raduus; }circle_t; int main(void) { circle_t c; circle_t* p1 = &c; point_t* p2 = (point_t*)&c; int* p3 = (int*)&c; printf("p1 = %p\n", (void*)p1); printf("p2 = %p\n", (void*)p2); printf("p3 = %p\n", (void*)p3); return 0; } p1 = 00000039EEB9F738 p2 = 00000039EEB9F738 p3 = 00000039EEB9F738
point_tμ circle_t μλ£νμ ν¬μΈν°λ ꡬ쑰체μ λ³μμ 첫λ²μ§Έ νλμΈ xμ μ£Όμλ₯Ό κ°λ¦¬μΌ°μ΅λλ€.
typedefλ₯Ό μ¬μ©νλ©΄ ꡬ쑰체μ μ λ³μΉ νμ μ μ μΈ ν μ μμ΅λλ€. μ΄λ μΆνμ struct ν€μλλ₯Ό μ¬μ©νμ§ μκ³ λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.