본문 바로가기

C언어

C언어

'언젠간 c언어를 쓸일이나 활용할 일이 존재하지 않을까?' 라는 마음에서 c언어를 공부를 시작해보았다.

다른 언어들 예를 들어 Java,Javascript,Python과 같은 언어들이 얼마나 많은 일을 뒤쪽에서 해주고 있는지를 알 수 있었다.

다른 비교적 최근에 나온 언어들에서는 한줄이면 가능 한 것을 c언어에서는 여러줄을 사용해서 구현을 해 줘야한다.

자료구조 또한 표준 라이브러리는 존재하지 않으며 필요할 경우 구현해서 사용하여야 한다.

 

기본적인 문법에서 c언어와 다른 언어들의 차이점

1. 문자열이 존재하지 않는다

문자열을 저장할때 char타입의 배열에 저장이 되게 된다.

int main() {
    char str[11] = "hello world";
    printf("%s",str);
    return 0;
}

 

2.정수형 자료형에는 sign정수과 unsign 정수 두가지 종료가 있습니다.

sign 정수 은 음수를 표현할 수 있으며 unsign 정수 의 경우 음수를 표현 할 수 없습니다.

이와 같은 이유는 메모리의 맨 앞에는 음수인지 양수인지 나타내는 부호 비트가 존재하게 되는데 부호비트를 사용하지 않으면 unsign 정수 이 되고 사용하게 된다면 sign 정수 이 됩니다.

64비트 환경에서 int 자료형의 경우 sign 자료형은  (2^31-1) -2,147,483,648 ~ 2,147,483,647 까지 나타낼 수 있으며 

unsign 자료형의 경우(2^32-1) 0 ~ 4,294,967,295 까지 나타낼 수 있습니다.

 

3. 형정의,구조체,공용체

형정의의 경우 자료형을 정의할 수 있는 기능입니다.

typedef int Bool;
Bool true = 1;

Bool을 자료형 처럼 사용 할 수 있다

구조체의 경우 구조체 안에 변수를 만들 수 있는 기능이다. 객체지향에서 객체 비스무리한 향이 나는 기능입니다.

typedef struct {
    char legs[10];
    int body;
    char arms[10];
} human;

human yellow = {left right,1,left right};
yellow.body

객체처럼 안에 있는 값을 불러 올 수 있습니다.

공유체란 안에 있는 변수 한가지를 설정하면 나머지 변수들이 바뀌게 됩니다.

typedef union
{
    unsigned char a;
    unsigned short b;
    unsigned int c;
} SHAREDATA;

int main(void)
{
    SHAREDATA var;
    var.c = 0x12345678;  
    printf("%x\n", var.a);
    printf("%x\n", var.b);
    printf("%x\n", var.c);
    return 0;
}

 

4. 포인터

주소 연산자 &는 변수에서 메모리의 주소값을 나타나게 해주는 역활이고

참조 연산자 *는 메모리 주소값으로 값을 읽어들이는 역활 입니다.

둘은 역 관계에 존재합니다.

int main() {
    char arr[3] = {'a','b','c'};
    //arr배열 그 자체를 가르킴
    char* arr_p = arr;
    // arr배열 안의 요소 한개를 가르킴
    char* arr_elment_p = &arr[0];
    printf("%s\n", arr_p);
    printf("%c\n",*arr_elment_p);
    printf("%c",*arr_elment_p +1 );
    return 0;
}

5.배열의 길이(갯수) 구하기

배열의 길이(갯수)를 구하기 위해서 배열의 총 크기를 구한뒤 자료형으로 나누어 배열의 길이를 구하게 됩니다.

int main() {
    char arr[3] = {'a','b','c'};
    int len = sizeof(arr)/sizeof(arr[0]);
    printf("%d",len);
    return 0;
}

6. 메모리 동적 할당

malloc, calloc,realloc 새가지 함수가 있으며

malloc(size)은 파라미터로 입력한 사이즈 만큼 메모리를 할당해주는 함수 입니다.

int main() {
  	int i;
	int arr_len = 3;
	int* arr_pt;
    // 메모리의 동적 할당 
	arr_pt = (int*) malloc(arr_len * sizeof(int));	
	arr_pt[0] = 1;
    arr_pt[1] = 2;
    arr_pt[2] = 3;
	for (i = 0; i < arr_len; i++)
	{
		printf("%d ", arr_pt[i]);
	}
	
	free(arr_pt);		
}

realloc 의 경우 메모리를 다시 할당하는 것으로

realloc(원본 포인터, 다시 지정할 사이즈)로 사용합니다.

	int i;
	int arr_len = 3;
	int* arr_pt;
    // 메모리의 동적 할당 
	arr_pt = (int*) malloc(arr_len * sizeof(int));	
	arr_pt[0] = 1;
    arr_pt[1] = 2;
    arr_pt[2] = 3;
	// 메모리 재할당
    arr_pt = (int*) realloc(arr_pt,(4 * sizeof(int)));
    arr_pt[3] = 4;
    for (i = 0; i < 4; i++)
	{
		printf("%d ", arr_pt[i]);
	}

	free(arr_pt);

calloc은 malloc과 거의 유사한 기능을 하는 것으로 반복 횟수(배열의 길이)와 자료형의 크기(메모리 크기)를 넣는 것 입니다.

*calloc(반복 횟수,반복할 사이즈);

int main() {
  	int i;
	int arr_len = 3;
	int* arr_pt;
    // 메모리의 동적 할당 
	// arr_pt = (int*) malloc(arr_len * sizeof(int));
    //위와 동일
    arr_pt = (int*) calloc(arr_len ,sizeof(int));
	arr_pt[0] = 1;
    arr_pt[1] = 2;
    arr_pt[2] = 3;
    for (i = 0; i < arr_len; i++)
	{
		printf("%d ", arr_pt[i]);
	}

	free(arr_pt);		
}

 

메모리를 할당 해준뒤에 꼭 메모리 free를 통해 메모리를 해제를 해줘야 합니다.

 

이정도가 c언어를 공부하면서 느낀 다른 언어들과 다른 점이다.

크게 포인터와 메모리 동적 할당 개념을 제외하고 특이한? 기능은 없었으며, 자바스크립트의 깊은 복사 문제 덕분에 포인터를 이해하기 수월했던 것 같다.