*만 붙여주면 함수 포인터가 선언된다
자료형 (*함수 포인터 이름) (인자 목록)
int (*func) (int a);
#include <stdio.h>
int Plus(int a, int b) {
return a + b;
}
int Minus(int a, int b) {
return a - b;
}
int main()
{
int a = 20;
int b = 10;
int select = 0;
int (*fPtr)(int pa, int pb);
while(1) {
printf("Select : ");
scanf("%d", &select);
switch(select) {
case 1:
fPtr = Plus;
break;
case 2:
fPtr = Minus;
break;
case 3:
return 0;
default :
break;
}
int result = fPtr(a, b);
printf("result = %d\n", result);
}
return 0;
}

var a = 10 → 동적 바인딩 (즉흥)int a = 10 → 정적 바인딩 (계획) struct student
{
char name[10];
int age;
int height;
}
struct키워드는 구조체라는 데이터 타입을 의미
student는 내가 만든 구조체의 이름
name,age,height는 구조체 멤버
구조체student는 사용자인 내가 정의한 새로운 데이터 타입이다.
⇒student a;를 통해 데이터 타입이student인a라는 변수 선언 가능

[구조체 변수명].[구조체 멤버]
ex)st1.name,st1.age,st1.height
#include <stdio.h>
#include <string.h>
struct student {
char name[10];
int age;
int height;
} st1;
int main()
{
strcpy(st1.name, "한비랑");
st1.age = 23;
st1.height = 162;
printf("이름 = %s, 나이 = %d, 키 = %d\n", st1.name, st1.age, st1.height);
return 0;
}

출력 예)물건의 이름 : 책물건의 높이(cm) : 30물건의 무게(kg) : 2보낼 물건의 정보 : 책, 30cm, 2kg#include <stdio.h>
#include <string.h>
struct object {
char name[20];
int height;
int weight;
};
int main()
{
struct object obj;
char name[20];
int h, w;
printf("물건의 이름 : ");
scanf("%s", name);
printf("물건의 높이(cm) : ");
scanf("%d", &h);
printf("물건의 무게(kg) : ");
scanf("%d", &w);
strcpy(obj.name, name);
obj.height = h;
obj.weight = w;
printf("\n보낼 물건의 정보 : %s, %dcm, %dkg", obj.name, obj.height, obj.weight);
return 0;
}
union unTemp
{
char a;
int b;
double c;
} un;
enum을 사용하여 정의한다. enum Week
{
sun = 0,
mon,
tue,
wed,
thu,
fri,
sat
};
#include <stdio.h>
enum Week
{
sun = 1,
mon,
tue,
wed,
thu,
fri,
sat
};
int main()
{
int day;
printf("요일을 선택하세요 : ");
scanf("%d", &day);
switch(day) {
case sun :
printf("Sunday\n");
break;
case mon :
printf("Monday\n");
break;
case tue :
printf("Tuesday\n");
break;
case wed :
printf("Wednesday\n");
break;
case thu :
printf("Thursday\n");
break;
case fri :
printf("Friday\n");
break;
case sat :
printf("Saturday\n");
break;
default :
printf("잘못 입력하셨습니다.\n");
break;
}
return 0;
}
push : 집어넣음 / pop : 맨 위의 것을 뺌.
int a;
double b;
int student[10];
int student[100];
int num;
fputs("학생 수를 입력하세요 : ", stdout);
scanf("%d", &num);
int student[num];
int student[num]은 컴파일타임에 실행void* malloc(size_t size);
size는 바이트 단위로 입력한다.void *의 의미 : 타입이 지정되지 않는 포인터. (난 당신이 원하는 메모리 크기만큼 하당해줄테니, 메모리는 당신이 원하는 형태로 정해서 사용하세요.) int main()
{
int num;
int *student;
printf("학생 수를 입력하세요 : ");
scanf("%d", &num);
student = (int *)malloc(sizeof(int) * num);
if (student == NULL) {
printf("메모리가 할당되지 않았습니다.\n");
return 0;
}
printf("할당된 메모리 크기는 %d입니다.\n", sizeof(int)*num);
free(student);
return 0;
}
free를 통해 메모리를 해제해주어야만 한다. 그렇지 않으면 메모리 누수로 시스템에 떠돌아다니는 메모리가 됨. (치명적인 오류 발생의 원인이 될 수 있음) 
클래스 = 데이터 + 메소드
데이터는 은닉된 데이터임 (= 프로퍼티 = 필드 = 속성 = 멤버 변수)
메소드는 클래스 내에서만 정의된 함수임. (= 멤버 함수 = 인터페이스)