반응형

프로그래밍/C언어 39

자료구조 스택(stack) C언어

스택(stack)도 연결리스트와 마찬가지로 선형자료구조다. 우리가 알고있는 메모리의 스택도 같은 구조를 가진다. 스택의 특성은 LIFO(Last in First Out)으로 저장되는 구조인데, 스택을 비우는 순서는 가장 마지막으로 넣은 정보부터 빠지게된다. 책을 박스에 차곡차곡 쌓아서 보관해 놓았는데, 다시 책들을 꺼내기 위해서는 맨 위에서부터 빼내야 하는 이치와 같다. 우리가 알고있는 재귀함수를 이용하는 것도 스택의 특성을 사용한다. 좀 더 예를 들어보면 우리가 C프로그래밍을 할 때 가장먼저 호출되는 함수는 main함수다. 하지만 main함수는 가장 마지막에 반환된다. (LIFO == FILO ) 우리가 구현하고자 하는 스택을 간략히 표현해 보겠다. 2014/02/28 - [프로그래밍/C언어] - 동적..

자료구조 - 연결리스트[linked list] C언어

연결리스트는 동적배열과 비슷하지만 동적배열에 비해 데이터를 유연하게 삽입, 삭제할 수가 있다. 동적배열의 경우엔 삽입을 하기위해선 배열의 크기를 체크하고 배열의 공간이 꽉 차있다면 realloc을 하였다. 그리고 삽입, 삭제할 지점 이후의 자료들은 메모리의 이동이 이루어지기 때문에, 삽입시 부자연스럽기도 하다. 동적배열과의 연결리스트의 차이점은 배열의 특성은 메모리공간에서 연속이라는 점이다. 그래서 첨자연산으로 빠른 속도가 보장되지만, 메모리가 연속이어야 하기 때문에, 삽입과 삭제가 번거롭다. 하지면 연결리스트는 메모리상에 연속이지 않아도 된다. 다음데이터에 대한 링크정보를 지니고 있기때문에 가능한 일이다. 2014/02/28 - [프로그래밍/C언어] - 동적배열 자료구조의 시작 2014/03/17 - ..

동적배열에서 memmove함수 사용하기 연습 C언어

동적배열은 실행중 배열의 크기를 유연하게 바꿀수 있는 배열이다. 이전에 대략적으로 다뤘지만, 개인적으로 이 동적배열을 잘 다루면 앞으로 나오는 자료구조를 이해하고 적응하는데 많은 도움이 되기 때문에, 몇가지 중요한 포인트를 정리하고자 한다. 아니면 아주 동적배열에서 특정 데이타를 삽입하는 코드를 외우는 것도 괜찮다 생각된다. memmove 함수의 선언을 써보자. void *memmove(void *dest, const void *src, size_t n); // src부터 n만큼을 dest로 이동 memmove함수의 특징은 메모리상에서 dest와 src의 위치가 겹쳐 있어도 데이타의 손실없이 이동이 이루어 진다는데 있다. memcpy와 동작을 비교하기도 하지만 컴파일러에 따라서(gcc,vc)는 memcp..

동적배열 자료구조의 시작

c언어에서 배열은 가장 단순하면서도 직관적인 자료구조다. 배열의 요소가 연속적인 메모리 공간에 붙어 있고 요소의 타입이 동일하기 때문에, 포인터 연산을 통한 데이터로의 접근이 빠르다. 그런데 배열을 사용하면서도 정형적인 형식과, 특징때문에, 유연한 요소의 삽입과 삭제에 제한이 있고, 일단 선언되면 배열의 크기를 가변적으로 바꿀 수 없기 때문에 유연한 사용에 한계가 있다. memmove 함수를 이용해서 메모리의 위치를 이동하여 삽입 삭제가 가능하지만, 이 또한 처음에 정해진 배열의 크기안에서만 가능하다. 이를 해결 하기 위한 것이 동적배열이다. 2014/03/17 - [프로그래밍/C언어] - 동적배열에서 memmove함수 사용하기 연습 C언어 2014/03/20 - [프로그래밍/C언어] - 자료구조 - 연..

구조체 정리 C언어

배열은 한가지 Type만을 요소로 갖는다. 그래서 좀 더 다양한 자료들을 사용하기 위해서는 구조체를 사용한다. 배열은 각 요소들의 타입이 같기 때문에 일련적인 수로서 각 요소에 점근 할 수 있었다. 예를들면 arr[7] 이런식이었다. 이런 접근은 포인터 연산인데 각 요소들의 타입이 한가지기 때문에 포인터 연산이 가능했었다. 이제 구조체에 대해서 알아봐야하는데, 이런 근본적인 형태의 차이로 인해서 구조체의 각 요소들에 접근하는 방식은 배열과 차이점이 생길 수 밖에 없게 된다. 그리고 배열에서는 요소라고 하지만, 구조체에서는 멤버변수라고 부른다. 아무튼 여러가지 측면에서 다른 양상을 보이는 두 자료구조는 비교대상이지만 따로 때어놓고 이해하는 것이 편리하다. 구조체의 선언 다음은 구조체를 선언한 코드다. 위 ..

배열 포인터 C언어

이 전시간 포인터 배열에 대해서 알아보았다. 이번에는 배열 포인터에 대해서 간단히 알아보고 구조체로 넘어갈까 한다. 문자열도 다뤄야하는데 사실 배열과 문자열에 관한 내용은 천천히 다루는게 좋지않을까 싶다. 문자열을 다루는 것이 그만큼 배열과 밀접하고 중요하기 때문이다. 또한 포인터의 개념도 완벽히 잡히지 않은 상태에서 다루다보면 이도 저도 안되기 때문이다. 그래서 문자열과 배열을 한번에 너무 깊게 다루는 것은 전반적인 C학습에 저해 요소라 생각든다. 이 부분은 어떤 프로젝트를 하면서 그때 그때 필요한 부분을 익히는 것이 더 효율적이라 생각들고, 문법을 공부하는 입장에서는 C의 전반적인 흐름을 익히는 것이 중요하다 생각된다. 이 블로그의 포스팅의 목표는 간단한 주소록을 시작으로 채팅프로그램, 그리고 C++..

gotoxy()함수를 만들어 써보자.

이전 터보C에 있던 함수입니다. 콘솔환경에서 개발하시는분은 거의 안계시지만, C언어를 공부하시고, 콘솔에서 게임을 간단히 만드시려면 필요한데, 쓰는 방법은 워낙 유명합니다. 윈도우 API를 이용하여 쓰는 방법인데, 간단하게 windows.h 을 include 하신후 다음과 같이 함수를 만들어 쓰시면 됩니다. 첫번째 함수는 settextcolor이고 쓰시는 방법은 settextcolor(1,1) 이런식으로 쓰시면됩니다. 인수에따라 색이 바뀝니다. 두번째 함수는 gotoxy이고 쓰시는 방법은 인수가 좌표고 커서를 그곳에 위치시킵니다. 저같은경우는 아래 함수를 모듈로 만들고 헤더파일을 만들어 인클루드해서 씁니다. 2014/01/24 - [프로그래밍/C언어] - 분할컴파일 하는법(gcc) c언어 헤더파일에 있는..

포인터배열(Ragged) c언어

이전에 동적할당의 경우에서도 잠깐 나왔었는데, 포인터 배열에대해서 좀 더 알아보자. 포인터 배열은 말 그대로 배열의 요소들이 포인터인 배열이다. 선언을 하는 방법은 int *arr[5]; // 이런식으로 단순히 *구두점을 배열명에 붙여주면된다. int *arr[5]의 각요소들인 arr[0],arr[1],arr[2],arr[3],arr[4] 은 포인터가 된다. 아래의 예를 보자. 위 코드는 두가지 사실을 말해준다. 첫째로 각 요소들은 포인터로서 같은 크기지만, 각각 크기가 다른 문자열을 가리키고 있다. 두번째는 이런 요소들이 문자열을 가리킨다고해서 배열명은 아니라는 것이다. 마치 2차배열과 동작이 비슷해 보이지만, 이런 포인터 배열의 요소는 어디까지나 포인터라는 것이다. 만약 배열명으로 작동한다면, 배열명..

값에 의한 호출(call by value)과 참조에 의한 호출(call by reference)에 대한 이해 C언어

함수에서 외부의 값(실인수)을 전달받기 위해 사용되는 변수를 형식인수라한다. 이 형식인수에 외부값(실인수)이 전달되는 방식에 따라 값에 의한 호출과 참조에 의한 호출로 나뉘어 지는데, 값호출과 참조호출로 나뉜다. 일반적으로 실인수를 형식인수에 전달시 대입연산을 하는 경우와 마찬가지 동작이 일어나, 실인수의 값을 형식인수에 대입을 한다. 메모리상에선 실인수의 값을 복사한 후 형식인수에게 할당을 한다. 그 결과 같은 값을 지닌 변수가 서로 다른 메모리 공간에 2개 존재하게 된다. 이 경우 형식인수값을 조작하더라도 실인수의 값은 어떤 영향도 받지 않다. 이런 호출방식을 값호출이라고한다. 그럼 참조에 의한 호출은 어떤 것인까? 실인수의 값을 전달하는 것이 아닌 주소를 전달하는 것이다. 사실 내부적으로 보면 값호..

이중포인터에 대한 이해 C언어

이중포인터에 앞서 필요한 개념을 간단히 설명하겠다. 변수는 메모리상에 데이터가 차지하는 공간을 대변한다. 이런 변수는 시작주소값이 존재하고 타입이 존재한다. 주소값과 타입을 알면 메모리 공간에서 변수를 해석할 수 있다. 이렇게 기본적인 지침을 설명하는 곳은 그리 흔치 않다. 포인터 타입의 행동특성 포인터의 개념은 실제로 너무도 단순 명확하다. 변수의 주소를 가리키는 또 다른 변수라 생각하면된다. 그래서 포인터라고도 하지만 포인터 '변수'라고도 불리운다. 주소를 가리킨다는 말은 실제로는 포인터는 대상체의 주소값을 지닌다는 말이다. 포인터의 동작은 이렇게 자신이 지닌 값, 즉 주소값을 '*'연산을 통해서 참조하는 특징을 한다. 즉 포인터 타입의 행동특성이다. 2013/11/28 - [프로그래밍/C언어] - ..

반응형