Programming Language/C
[C] 정리 (2)
[C] 정리 (2)
2022.06.14C에서 문자열을 다룰 때는 char타입의 배열을 사용하고, 배열의 마지막에는 문자열의 끝을 의미하는 \0 (널 문자)가 들어간다. 즉, char배열의 크기와 문자열의 길이는 다를 수 있다. 널 문자를 적절히 사용해 문자열을 효과적으로 다루자. - scanf를 사용해 문자열을 저장할 때 배열의 최대치를 넘어가는 경우를 방지하기 위해 "%48s"처럼 최대 몇 글자까지만 입력하라는 제한을 설정할 수 있다. - gets()와 puts()를 통해 문자열만을 입력받고 출력받을 수 있다, 줄 단위로 입력받고 줄 단위로 출력받을 수 있어 공백이나 탭을 문자열에 포함할 수 있다. gets 대신 fgets를 사용해 배열의 크기를 초과하지 않도록 설정할 수 있다. - 모든 배열은 1차원배열로 생각될 수 있고, 모든 요소가 ..
[C] typedef / Union
[C] typedef / Union
2022.05.26typedef typedef int INT; 위와 같이 작성하면 INT라는 이름의 타입을 새로 생성한다. 자바에서 클래스의 이름을 타입처럼 사용하듯, 여기서도 비슷한 맥락으로 생각하면 된다. 지난번에 배운 구조체를 정의할 때는 struct struct_name variable_name 이렇게 길게 선언해야 했는데, typedef로 미리 구조체를 어떻게 사용할 지 명시해 두면 좀 더 간결하게 사용할 수 있다. 위와 같이 활용한다. 원래 이름은 아예 생략해서 사용할 수도 있다. Union C말고 다른 언어에서는 거의 사용하지 않는 타입이다. 위의 그림을 살펴보자. Union 타입으로 정의하면, 멤버변수들이 같은 위치에서 시작하게 된다. 즉, mem1에 10을 넣고 mem2에 20을 넣으면 mem1에 10을 ..
[C] 구조체
[C] 구조체
2022.05.26자바에 클래스가 있다면, C에는 구조체가 있다. (struct) 물론 모든 부분이 같지는 않고, C의 구조체의 마지막에는 세미콜론을 붙여야 하고, C의 구조체의 멤버로는 메서드가 포함될 수 없는 등 다른 부분이 있다. 구조체의 메모리 모양, 선언, 접근 방법은 자바에서 배운 내용과 비슷하다. 이 부분에서 잠깐 "배열의 이름은 포인터다"를 떠올릴 수 있는데, 구조체의 이름도 구조체의 첫 번째 멤버의 주소라고 생각할 수 있다. (구조체에서 메모리는 연속적으로 구성되어있다.) 구조체를 선언하면서 동시에 그 구조체 타입의 변수도 선언할 수 있음을 기억해 두자. 따로 따로 선언하는 것과 같은 효과를 낸다. 선언과 초기화를 동시에 진행할 수도 있다. 위의 두 가지를 한 번에 사용할 수도 있다. #include #i..
[C] 동적 메모리
[C] 동적 메모리
2022.05.23메모리를 동적으로 할당받을 때 malloc외에도 realloc, xalloc, calloc 등 alloc의 가족들이 있다. 하나 하나 살펴보자. calloc calloc은 인자 전달 방식과 메모리를 0으로 초기화하는 부분 말고는 malloc과 동일하다. int *p = (int*)calloc(24, sizeof(int)); int *p = (int*)malloc(sizeof(int)* 24); 두 문장은 같은 역할을 한다. realloc int *p = (int*)malloc(3 * sizeof(int)); int *np = (int*)realloc(p, 5*sizeof(int)); realloc은 원래 사용하던 공간을 최대한 재활용하는 방향으로 메모리를 확보한다. 이전 포인터 p근처 공간이 넉넉하면 주..
[C] Stack / Heap
[C] Stack / Heap
2022.05.23스택 메모리에는 지역변수, 인자, 리턴 값 등이 있다고 배웠다. 스택 메모리에서는 변수의 선언 위치에 따라 생성/제거 시기가 정해지지만, 힙 메모리에서는 개발자 마음대로 쓰고 버릴 수 있다. 마치 전역변수처럼, 한 번 선언해두면 여러 함수에서 함께 사용할 수 있지만, 전역변수와는 달리 다 썼다 싶으면 제거할 수도 있다. 스택 / 힙 메모리 구조는 C뿐만 아니라 거의 모든 프로그래밍 언어에서 공통되는 요소이다. 자바를 예로 들면, A a = new A(); 코드를 실행하면, new 연산자가 힙 메모리에 공간을 확보한 후 동적 변수를 만든다. 그러고 나서, 동적 변수에 OID(Object Identifier)를 붙여주고 new연산자는 A의 생성자를 실행한 후 OID를 리턴한다. 오른쪽 그림에서 그래프 형태는..
[C] 배열 포인터 / 포인터 배열 정리
[C] 배열 포인터 / 포인터 배열 정리
2022.05.11배열 포인터는 다차원배열 / 포인터 배열은 일차원배열. 함수의 인자로 다차원배열을 전달해야 하는 경우가 있을텐데, 배열의 포인터를 적절히 사용하도록 하자. 앞에서 계속 확인한 바와 같이 이차원 배열을 포인터로 표현할 때도 연산은 비슷한 양상을 보인다.
[C] 배열의 포인터
[C] 배열의 포인터
2022.05.01지난번에 포인터의 배열을 포인터의 포인터로 바꿔서 표현할 수 있다는걸 배웠다. 그럼 이제 배열의 포인터에 대해 공부할 차례이다. 말 그대로 포인터 변수를 따라가면 배열이 나오는.. 그런 상황에서 배열의 포인터를 사용한다. 뒤에 [10]을 붙여서 주소를 통해 찾아간 값이 10의 크기를 가지는 char타입의 배열임을 명시해준다. 포인터의 배열과 배열의 포인터를 헷갈리지 말자. 괄호를 어떻게 붙이는가에 따라 두 가지가 갈린다. 예시를 통해 정리하자.
[C] 이중 포인터
[C] 이중 포인터
2022.05.01포인터 변수는 어떤 값의 주소를 담는 변수이다. 그러면 포인터 변수의 주소를 담는 값도 있지 않을까? 즉, 포인터의 포인터도 있지 않을까? 주소 1048로 찾아가면 double타입의 3.14가 있는데.. 주소 1072로 찾아가면 주소 1096이 있다. 주소는 혼자 사용하면 아무 의미가 없다. 의미가 생기려면 1096을 주소로 찾아갔을 때 얻을 수 있는 특정 값을 알 수 있어야 하지 않을까? 포인터의 포인터는 int ** d 처럼 타입과 * 두 개로 표현한다. 변수 d 는 * 타입. 즉, 주소 타입이고, 그 주소를 찾아가면 또 다시 주소가 나오고, 그 주소를 찾아가면 int값이 나온다.. 정도로 생각할 수 있다. 예제를 통해 확실하게 잡고 넘어가자. 포인터의 포인터가 존재함을 알았는데.. 그럼 포인터의 배..
[C] 다차원 배열 초기화
[C] 다차원 배열 초기화
2022.05.01정방형 배열의 형태를 지니게 하기 위해 남는 공간은 0으로 채워준다. 2차운 배열에서 row부분의 크기는 생략할 수 있다. (알아서 계산해준다.) 2차원 배열을 1차원 배열의 모음으로 해석할 수 있다. 1차원 배열에서 포인터를 사용해 배열을 다룬 것 처럼, 2차원 배열에서도 첫 번째 요소의 주소를 취할 수 있다. 문자열을 배열로 다룰 때 자주 사용된다. 3차원 배열도 크게 다른 부분은 없다. 지정할 때 높이 / row / column 순으로 지정함을 기억하자.
[C] 다차원 배열
[C] 다차원 배열
2022.05.01먼저 배열의 종류에 대해 알아보자. static배열과 Fixed Dynamic배열은 컴파일 할 때 배열의 최대 범위가 정해지지만, Dynamic배열은 배열의 최대 범위가 계속해서 변할 수 있다. (Java의 ArrayList와 비슷한데, 일단은 ArrayList도 배열이라고 개념적으로 생각하자.) 배열을 관리할 때는 Descriptor를 사용한다. Descriptor는 배열을 선언한 뒤 선언된 배열을 저장할 때 사용된다고 이해하면 되고, 컴파일 시에 사용된다. 즉, 메모리를 할당하는 코드를 생성하기 위해 Descriptor가 사용되고, 왼쪽 그림과 같은 정보를 지닌다. 컴파일 말고 런타임 과정에서도 Descriptor를 가질 수 있는데, Java를 생각하면 이해하기 쉽다. Java에서 배열을 다룰 때 i..
[C] 정리 (1)
[C] 정리 (1)
2022.04.18sizeof연산자는 byte단위의 정수로 타입의 크기를 반환하며, 반환 타입은 size_t이다. (unsinged int 와 비슷) sizeof('A)의 결과는 1이 아니라 4이다. 컴파일 시 문자코드로 바뀌고, int타입으로 인식된다. 증감 연산자의 전위형(prefix) j = ++i; // 값이 참조되기 전에 증감연산자가 실행된다. 증감 연산자의 후위형(prefix) j = i++; // 값이 참조된 후에 증감연산자가 실행된다. 독립적인 하나의 문장으로 쓰일 경우에는 아무 차이가 없다. 큰 타입으로 자동으로 형변환 되지만, 비트 수가 맞지 않으면 값의 손실이 발생할 수 있다. null문자의 문자 코드는 0이다. 실수형은 근사값으로 저장되기에, 값을 비교할 때 오차가 발생할 수 있다. double타입과..
[C] const
[C] const
2022.04.13자바에서는 변수를 상수로 사용할 때 사용하는 키워드인 const이다. C는 시스템과 관계가 깊은 언어이기에 const키워드가 매우 중요하고, 나아가 C++까지도 영향을 미치는 키워드이다. const int * ptr 포인터 변수 앞에 const를 붙이는 경우를 살펴보자. "ptr주소를 통해 찾아간 값은 변경할 수 없다" 라는 의미를 지닌다. int num = 5; const int * ptr = # *ptr = 10; // ptr을 통해서는 값을 변경할 수 없다. 오류. num = 20; // 이거는 상관없음. ptr을 통해 변경하는거만 금지 const int num = 5; int * ptr = # // num은 상수인데, ptr을 통해 값이 변경될 수 있어서 오류! const int *..