반응형

프로그래밍/C언어 39

c언어 재귀 함수(recursive function)

글의 주제와 상관은 없지만 프로그래밍을 잘하기 위한 필요한 능력 중에 하나가 단기기억력이라고 생각된다. 수천, 수만 줄의 코드에서 연관된 코드들을 살펴볼 때 단기 기억력이 좋다면 까먹고 다시 돌아가는 일이 적어지기 때문이다. 단기 기억력은 결국은 집중력과 연관되는데 아무튼 프로그래머는 참 에너지 소비가 많은 직종 중에 하나라고 생각된다.그리고 개인적인 경험에 비춰보면 대부분의 프로그래밍을 하는데 있어서 알고리즘은 필수는 아니지만 게임프로그래밍과 같이 수학적 베이스를 요구 하는 프로그램을 만드는데 있어서 알고리즘을 잘 다루는 것은 큰 이점이 된다. 이 포스팅에서 다룰 재귀 함수 또한 다양한 알고리즘의 기본 토대가 되는 개념이다.그럼 이 글의 주제인 재귀함수는 무엇인가?쉽게 말해 자기 자신을 호출하는 함수를..

c언어 포인터 읽는 방법만 알아도 반은 안다.

요즈음 책들은 양도 질도 많이 높아졌다고 생각합니다. 그래서 C언어를 공부하시는 많은 분들은 이 내용을 잘 아시리라 생각듭니다. 제가 요즈음 나온 기본 문법서는 제대로 본적이 없지만 잘은 모르겠네요. 아무튼 아직까지 책에서 제대로 이 부분을 짚어놓은 책을 본 적이 없어서 포인터의 읽는 법에 대해서 몇가지 주저리 써보겠습니다. 몇몇 분들께는 조금이나마 도움이 되었으면 하는 바램으로 글을 써나가겠습니다. 사실 포인터에 대한 개념을 제대로 이해하기 위해서는 읽는 법이 매우 중요합니다. 왜냐면 어찌되었건 우리는 코드를 통해서 생각을 하기 때문에 코드가 자연스럽게 읽혀져야 포인터가 어떻게 동작하는지에 대해서 지속적이고 올바른 방향으로 생각해 나갈 수 있기 때문이다. 좀 추상적으로 말한 듯 한데 결론은 제대로 읽어..

자료구조 – 이중 연결리스트[doubly linked list] C언어

이중 연결리스트는 단순 연결리스트 자료구조를 확장한 형태이다. 단순 연결리스트를 정확히 이해했다면, 이중 연결리스트에 대한 구조 또한 쉽게 이해할 수 있다. 2014/03/20 - [프로그래밍/C언어] - 자료구조 - 연결리스트[linked list] C언어 왼편(단순연결리스트), 오른편(이중연결리스트)의 차이는 prev의 유무다. prev의 역할은 next와 비슷한데 next가 다음 노드(NODE)를 참조하는 것에 반해 prev는 이전 노드(NODE)를 참조한다. 이런 구조적인 차이로 인해 알고리즘도 약간의 변화가 생기게 된다. 단순 연결 리스트의 삽입, 삭제와 이중 연결 리스트의 삽입, 삭제에 대한 비교를 하면 쉽게 이해할 수 있다. 위 그림은 단순 연결리스트의 메모리의 구조를 모식적으로 나타낸 것이..

헤더파일에 static 선언을 하면 안 되는 이유

'먼저 헤더파일에는 함수 선언하여라' 라고 권하고 싶다. 이유는 혼동이 될 수 있는 함수와 변수의 차이 때문이다. 함수는 기본적으로 extern이다. void func(); 와 int a; 는 근본적으로 다른 선언이다.(C는 조건부,C++에서는 무조건 다름) void func()는 func()가 어딘가에 있어! 라고 말해주는 표시등이고, int a라 선언하면 데이터 영역에 a가 쓰여진다. 이런 차이로 프로그램에서 전역으로 선언된 a가 있는 헤더파일이 불려지는 횟수 만큼 초기화가 일어난다. 결국 스택이 아닌 정적영역에서 이름이 충돌하므로 에러가 생긴다. 헤더파일에 변수를 extern으로 선언하면? a.h에 extern int a; 와 b.h에 extern int b;가 선언되어있고, 각 cpp 파일에 변수..

전역 변수를 지역변수로 만들면? (static과 extern에 대한 이야기)

전역 변수를 지역적으로 만들면? 간단할 것 같은 위 물음에 답을 찾으려면 생각보다 많은 것에 대해 알고 있어야 한다. 긴 여정을 시작해 보자. 2015/06/18 - [프로그래밍/C언어] - 지역변수와 전역변수와 정적변수[static, extern, auto, register] 번역단위 전역 변수를 지역 변수으로 만들면 통용 범위가 모듈단위로 줄어든다. 모듈의 의미는 여러가지나 여기서 말하는 모듈이라 함은 하나의 cpp파일과 이 cpp파일이 포함하는 헤더파일(*.h)파일을 말한다. 이는 컴파일러가 컴파일을 하는 번역 단위다.(번역단위란, 하나의 목적파일(*.o)을 만드는데 필요한 소스파일을 말한다.) (참고 : a.cpp, a.h, main,cpp 가있고 a.cpp와 main.cpp는 각각 a.h를 in..

지역변수와 전역변수와 정적변수[static, extern, auto, register]

지역변수와 전역변수의 관계는 단순하지만 이해하지 못하면 난항을 겪게 되는 부분이다. 한번쯤 확실하게 정리해 둘 필요가 있는 파트다. 여기서는 일반적으로register사용빈도는 낮으므로 선택과 집중이라는 측면에서 register에 대한 내용은 다루지 않을 예정이다. 2015/06/20 - [프로그래밍/C언어] - 헤더파일에 static 선언을 하면 안 되는 이유 정적변수(static)는 지역변수(auto)와 전역변수(extern)를 짬뽕해 놓은 것이다. 지역변수와 정적변수는 확실히 구별되기 때문에 이 둘을 먼저 설명하는 것이 순서상 바람직하다 생각한다. 지역변수(auto)와 전역변수(extern) 지역변수는 우리가 흔히 main()함수 내에서 선언하는 모든 변수, 또는 사용자 함수 내부에서 선언하는(인수포..

2차원배열 동적할당

2차원 배열의 동적할당은 1차원 배열의 동적할당과 달리 생각해야 할 부분이 있다. 단순히 방법만 알아도 사용하는데 지장은 없지만, 복잡한 알고리즘내에서 계산을 하다 보면, 왜 기본이 중요한지 느끼게 된다. 그래서 기본을 설명하려 한다. 사전필요지식 2014/02/11 - [프로그래밍/C언어] - 이중포인터에 대한 이해 C언어 2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1) 2014/01/12 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(2) 2014/01/13 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(3) 2014/02/28 - [프로그래밍/C언어] - 동적배열 자료구조의 시작 먼저 1차원 배열과 2차원 배열의 정적할당을 할 경우의 메모리내에서는 ..

자료구조 -트리(Tree) C언어

트리의 특징 2차원적 구조를 가짐. 이에 반해 자료구조 배열, 연결리스트, 스택, 큐...등은 1차원 선형적 구조를 갖음. 2014/02/28 - [프로그래밍/C언어] - 동적배열 자료구조의 시작 2014/03/20 - [프로그래밍/C언어] - 자료구조 - 연결리스트[linked list] C언어 2014/03/21 - [프로그래밍/C언어] - 자료구조 스택(stack) C언어 2014/03/22 - [프로그래밍/C언어] - 자료구조 큐(Queue) C언어 용어정리 차수 - 자식 노드의 개수 잎 - 자식 노드가 0인 노드 서브트리(sub Tree) - 트리 내부의 작은 트리 포리스트(Forest) - 트리가 여러 개 모인 것. 레벨(level) - 루트에서 그 노드까지의 거리를 말함.(루트레벨 :1) 높..

메모리 구조,c언어를 이해하기 위한(텍스트,데이타,bss,힙,스택)

C언어를 잘하고 싶다면 메모리 구조에 대한 이해는 꼭 필요합니다. 물론 다른 언어도 마찬가지지만 메모리에 대한 조작이 비교적 많은 C언어는 메모리 구조는 바로 언어에 대한 이해도를 높여줍니다. C언어로 짠 프로그램이 메모리에 어떻게 로드 되는지 알아보겠습니다. 다음 코드는 주의 깊게 안보셔도 됩니다. 완전 쓸데없는 노가다입니다. 흑 ㅠ 코드를 분석할 필요는 없고, 결과를 보려고 만든 코드니 결과만 알면 됩니다. 변수들의 선언 방식과 위치에 따라서 주소값이 어떤 규칙성이 보일 듯 하죠? 4로 시작하는 주소가 많고, 2,6으로 시작하는 주소도 보이네요. 대충 3개 정도로 나뉘어 보입니다. 실제로는 5개의 영역입니다. 일반적으로 텍스트 영역이 낮은 주소-> 스택영역으로 갈수록 높은주소, 스택을 제외한 나머지 ..

자료구조 큐(Queue) C언어

스택은 데이타의 출입구가 한 군데인데 반해, 큐는 데이타 입출입이 양뱡향입니다. FIFO(First in First Out)구조를 가졌습니다. 터널을 지나는 자동차를 생각해보면 터널은 큐고 터널의 길이는 큐의 크기가 됩니다. 그리고 자동차는 데이타가 되겠죠. 큐도 스택과 비슷하고 데이타의 입력방향과 출력방향이 다르다는 것만 주의하면 됩니다. 스택에서는 offset(오프셋)을 기억하는 변수를 하나만 두었지만, 큐에서는 입력과 출력의 위치가 다르기 때문에 두개를 두어야합니다. 데이타가 머리부터 차례로 입력된다 생각하고 변수를 정하면, FIFO구조기때문에 출력위치는 머리가 됩니다. 그리고 입력위치는 꼬리가 되겠죠. 출력위치를 가리키는 변수를 head, 입력위치를 가리키는 변수를 tail이라고 하면 구조는 다음..

반응형