C는 Microsoft Imagine에서 Visual Studio 2015를 다운받으세요. 부산대학교 웹메일 계정을 하나 생성하셔서 해당 메일 주소를 통해 학생 인증 하시면 무료로 이용할 수 있어요. Dev C++ / 코드블럭은 초보자에겐 비추입니다. 개인적으로는 둘 중 추천하자면 코드블럭인데 MinGW 연동 등 자잘한 트러블슈팅을 해야 하는 경우들이 있거든요. 또한 프로그래밍에 있어서 가장 중요한 기능 중 하나인 Code Completion (코드 자동 완성)이 Visual Studio에서 가장 잘 지원됩니다. (물론 좀 더 매니악한 쪽을 원한다면 다른 선택지도 있긴 합니다.)
매트랩은 유료니까 알아서 잘 다운받으시고... C를 배우시려는 목적이 뭔지 모르겠지만 개인적으로는 GUI 입문용으로 C#이나 델파이도 나쁘지 않다고 보네요. 왜냐면 C로 GUI를 구현하기 위해서는 윈도 기준으로 설명드리자면 WinAPI, MFC, Qt 등등의 선택권이 있는데 공통적으로 난이도가 좀 있거든요. 그에 비해 C#은 WYSIWIG 형식으로 화면에 버튼을 적당히 그려서 더블클릭하면 버튼을 눌렀을 때의 이벤트에 해당하는 코드를 작성할 수 있는 등 처음 입문시 중요한 개념을 익히기에 편리한 점이 있다고 봅니다.
포인터는 주소를 담는 변수입니다. 실행중인 프로그램의 모든 변수는 메모리에 저장됩니다. 메모리의 모든 위치는 하나의 숫자인 메모리 주소로 나타낼 수 있습니다. 예를 들어서, int A = 1; 에 의해 정수형 변수 A를 선언하고 1로 초기화했다고 하죠. int *B = &A; 에 의해 포인터 변수 B에 A의 주소를 넣을 수 있습니다. 이 때, &A는 실행중인 프로그램상에서 변수 A의 주소를 가리킵니다. (A는 1이 되고, &A는 예를 들자면 0x12345678이 될 수 있습니다. 참고로 메모리 주소는 실행될 때마다 매번 바껴요. 최신 운영체제에는 ASLR이라는 보안 기법이 적용되어 있어서 그렇지만 중요한 건 아닙니다.)
위의 상황에서 *B = 2; 라고 하면, 변수 A에 2가 기록됩니다. 이는 *B가 '포인터 변수 B가 담고있는 주소가 실제로 가리키는 어떤 것'을 나타내기 때문입니다. 말하자면, A와 *B 동등한 표현이라고 생각하시면 될 것 같네요. (이런 의미에서 &A와 B도 동등하겠죠. 물리학에서 단위를 맞추는 것과 비슷한 의미에서요.)
선언 시에 int *B = &A; 라고 할 때의 *B와 *B = 2; 라고 할 때의 *B는 구분하시는게 이해에 도움이 되지 않을까 하네요. 전자는 B가 포인터 변수임을 나타내고, 후자는 이미 포인터로 선언된 변수 B의 주소가 가리키는 것을 가리키고자 하는 표현입니다. 아무튼 난해하게 설명한 것이 아닐까 걱정되긴 하네요. 포인터의 기본 개념을 이해하시고 나면, 그 다음으로 배열, 문자열 처리, 동적 할당 같은 여러 응용에 대해서 배우실 수 있을 것 같네요. Playing with C는 좋은 책이라고 생각됩니다.
음, 글쎄요... 포인터를 이용한 강력한 예시가 많은데 코드 한 줄로 보여드리기에는 무리가 있네요. 예를 들어 전자회로에서 트랜지스터가 중요하지만 하나의 예시로 그 사실을 보이기 어려운 것처럼요. 아무튼 모든 소문자를 대문자로 바꾸는 코드를 포인터로 작성해봤습니다. (보통은 이렇게까지 복잡하게 작성하지는 않습니다.)
#include <cstdio>
int main() { char my_string[32] = "[A][B][C] Chocolate"; char *p;
위의 *B의 구분에 관해 부연설명을 하자면 int *B = &A;는 int *B; B = &A;로 나눠서 표현할 수 있습니다. 여기서 *B = &A; 라고 하면 에러가 발생합니다. 초기화되지 않은 B가 가리키는 주소에 정상적인 값이 들어있지 않으니까 그런 거고, 좀 더 직관적으로는 *B는 가리키는 것 ('값'이라고 하죠)이고 &A는 주소라서, 주소와 값 사이에는 타입이 일치하지 않습니다. (물리학에서 단위가 일치하지 않는 것과 유사하게요.) 주소는 주소끼리, 값은 값끼리 대입해야 하는 거죠.
댓글 달기