c언어

· c언어
C언어에서 배열을 사용할 때, 배열의 특정 위치에 접근하기 위해서는 다음과 같이 코드를 작성합니다. arr[5]; [5]는 특정한 연산을 수행합니다. 그리고 그러한 특정한 연산 때문에 다음이 성립합니다. arr[5] == 5[arr] 배열 첨자는 사실 다음과 같이 동작합니다. a[b] $\to$ *( a + b ) (*a)[b] $\to$ *( (*a)+b) (**a)[b] $\to$*((**a)+b) 이를 사용하면 다음과 같은 것들이 가능합니다. int arr[5][5]; int arr[5][5]; printf("%d\n", & arr[2][3]); printf("%d\n", & (*(arr + 2))[3] ); printf("%d\n", & (*( (*(arr + 2)) + 3)) ); int (*a..
· c언어
함수 포인터 함수는 저장된 메모리 공간을 나타내는 주소 지금까지 작성했던 여러 함수들은 사실 모두 포인터였습니다. 우선 예제를 보면서 이해해 보도록 하겠습니다. int add(int a, int b) { return a+b; } int main() { int (*operator) (int, int); operator= add;//저장 가능 //add=~~~ X : 변경 불가능 printf("%d\n",operator(1,2)); } 위와 같이 사용이 가능한데, 정확한 사용법은 다음과 같습니다. 함수 포인터의 자료형은 주소 타입입니다. 함수 포인터는 저장할 함수의 return type과 parameter type, parameter 개수가 동일해야 합니다. 함수의 변경은 불가능합니다. 함수 포인터의 사용..
· c언어
Enum 자바의 enum과 비슷하지만 오직 정수(int) 상수를 정의하기 위해서만 사용됩니다. typedef를 적용할 수 있으며, 단지 정수에 이름을 붙여준 것이므로 일반 int와 동일하게 작동합니다. typedef enum {Mon = 100, Tue = 200, Wed = 300, Thu = 400, Fri = 500} Weekdays;//typedef 가능 enum Operator {ADD = 1, MINUS = 2, Divied = 3}; enum {RED = 1, BLACK = 2, TREE = 3};//이름 없이 가능 int main() { enum Operator o = ADD; o = 2; o = 23;//가능! //Operator o = ADD; 불가능! Weekdays a = Mon; ..
· c언어
union union은 struct와 비슷한 생김새이나, 메모리를 조금 특별하게 관리하는 방법입니다. 우선 union을 사용하는 예시를 통해 사용 방법을 알아보도록 하겠습니다. union box { int item1; double item2; char item3[100]; }; strcut와 매우 비슷한 생김새입니다. union은 자신을 구성하는 멤버들 중 가장 용량이 큰 멤버를 기준으로 용량을 확보합니다. 그렇다면 위의 예시에서는 item3이 가장 크므로 100바이트가 할당되어야 할 거 같은데, sizeof를 해보면 104가 나옵니다. 이는 주소 조정(alignment) 때문에 발생하는 현상으로, item3[8]로 했을 가장 큰 것이 8byte이므로 그 정도를 할당하지만 item3[9]일 때는 넉넉히 ..
· c언어
typedef 타입 이름을 직접 짓고 싶을 때 사용합니다. 예를 들어 int 타입 중 나이를 나타내는 타입을 Age로 따로 이름을 짓고 싶을 수 있습니다. 이런 경우 typedef를 사용할 수 있습니다. 사용법은 다음과 같습니다. typedef int Age; typedef char Name[20]; typedef char * Nickname; 예시 #include #include #include typedef int Age; typedef double Height; typedef double Weight; typedef char Name[20]; typedef char * Nickname; struct person { Name name; Nickname nickName; Age age; Height h..
· c언어
구조체 (Struct) 구조체는 저희가 직접 정의하는 자료형으로써, 자바의 클래스와 조금은 비슷합니다. 구조체 안에는 여러 개의 변수가 들어올 수 있으며, 구조체를 구성하는 각 변수들을 멤버라고 합니다. 구조체를 정의하는 기본적인 형태는 다음과 같습니다. struct 구조체이름 { //멤버 선언 }; 예를 들어서 다음과 같습니다. struct person { char name[20]; int age; double height; }; 사용방법 구조체 변수를 생성하고, 구조체 멤버의 값을 사용하는 방법을 알아보겠습니다. 예시를 통해 살펴보겠습니다. #include #include struct person { char name[20]; char * nickName; int age; double height; ..
· c언어
동적 할당에 대해 이해하기 위하여 일반적은 프로그래밍 언어의 메모리 모델을 살펴보도록 하겠습니다. 메모리 모델 Stack 영역에는 지역변수, 인자, 리턴 주소가 할당됩니다. Heap 영역에는 동적 변수가 할당됩니다. 동적 변수는 함수와 독립적으로 존재하며 동적으로 생성하고 제거될 수 있는 변수입니다. 자바의 new 연산자를 사용하여 객체를 생성하면, 생성된 객체가 저장되는 영역이 바로 Heap 영역입니다. 동적 변수 만드는 방법 malloc을 사용합니다. malloc에 대한 정보는 다음과 같습니다. 자바 C 동적 변수 생성 명렁 new() malloc 생성 시 전달되는 것 클래스 이름, 인자 생성될 메모리 크기 예시 new A(); malloc(sizeof(int)); malloc(24);//직접 바이트..
· c언어
이중 포인터 포인터 변수는 주소(포인터)를 담는 변수입니다. 포인터 변수는 주소를 단순히 담고있는 역할만 하는 것이 아닌, 담고있는 주소값을 찾아갔을 때 존재하는 데이터를 조회하기 위해 데이터의 크기도 알고 있어야 합니다. 그리고 이를 타입으로 표현합니다. 예를 들어 int * a; 의 경우, a는 주소값을 담는 포인터 변수이며, 그 주소에 가면 int가 있다는 뜻입니다. 이중 포인터에서도 이는 동일합니다. ** doublePtr; 의 경우, doublePtr는 주소값을 담는 포인터 변수이며, 그 주소에 가면 주소(포인터)가 있다는 뜻입니다. 이중 포인터는 자신이 담고 있는 주소를 찾아가면, 다시 주소가 나오는 변수입니다. 포인터의 배열 포인터의 배열은 배열의 각 원소가 포인터인 배열을 의미합니다. 즉 ..
말 랑
'c언어' 카테고리의 글 목록