반응형

프로그래밍/C언어 39

C언어 배열에 대한 이해(1)

C언어의 기본문법을 체계적으로 정리할 생각은 아니었는데, 글도 점점 쌓여가고, 앞으로도 이런식이면 뒤죽박죽이 될듯싶어서 이해의 흐름 순서대로 정리해 나갈까합니다. 우선 그 유명했던 포인터에 대한 정리는 했으니, 이번엔 포인터의 연산이 많이 쓰이는 배열에 대한 정리를 할까합니다. 기존에도 배열에 관한 정리글을 올려놨는데, 중요한 핵심만 적어 놨습니다. 이번 글에선 그 핵심을 설명하고 포인터가 어떤식으로 작용하는지, 구체적인 예를 들어 설명해 볼까합니다. 배열을 단순하게 일반적인 변수에 첨자를 집어넣는 것으로 생각하면 많은 실수를 할 수 있습니다. 단순한 듯 보이는 배열녀석은 생각보다 다양한 속성을 가지고 있습니다. 어짜피 C언어의 전체를 훑으실거라면 적어도 배열과 포인터만은 확실히 하시길 바랍니다 배열과 ..

void형과 malloc함수에 대한 이해

오늘은 한번에 두가지 주제에 대해서 다루겠습니다. void와 malloc에 대해서 글을 써내려 가려하는데 좀 버거울 수도 있겠습니다. 저도 두 가지를 연관 지으려면 어떻게 해야할지 고심되고, 또 제가 포스팅을 하는 방식은 가능하면 다른 측면으로 생각해 보려고 노력하기 때문에 엉뚱해 질 수 도 있겠군요. 좀 길어질지 모르겠지만 우선 void에 대해서 알아보죠. void형(type)은 타입으로 보기엔 부족한 부분이 있습니다. 그 부족한 점 때문에 void라는 타입은 포인터변수에만 사용할 수 있네요. 일반 변수에 사용하면, 컴파일러는 에러를 뿜어낼 겁니다..(variable or field '변수명' declared void) 또, 함수의 반환형으로 선언할 수 있는데, 이경우 주의해야할 점이 있습니다. voi..

fgets함수 사용할때 주의점

fgets함수는 스트림의 정보를 스트림에 입력해준다.(문자열) 스트림이란 말이 생소한 사람도 있지만, 흔히 말해서 데이터가 존재하고 그 데이터의 입력 또는 출력이 가능한 장치(파일,모니터,키보드)들을 가르켜 스트림이라고 한다. 자세한 사용법은 파일 입출력을 공부해야하므로 넘어가도록한다. fegts은 스트림을 입력 받을때 엔터까지입력 받는 신기한 함수다. 때문에 위 함수로 입력 받은 문자열의 길이는 입력한 문자열+1이 된다. 이 함수를 제대로 쓰려면 문자열을 수동적으로 맞춰줘야한다. 방법은 여러가지가 있겠지만 가장 일반적인 방법을 소개한다. 비교를 위하여 아래는 gets을 먼저 사용한 일반적인 입력이다. 실행후 gets에 답을 문자열은 my home을 입력하였다. 워낙 간단한 코드라 대충 짠 점은 양해 바..

분할컴파일 하는법(gcc) c언어

리눅스환경을 사용하거나 Mingw을 사용할 때 툴을 사용하지 않고 직접 분할 컴파일을 하는 방법입니다. 가장 간단한 예제입니다. 세개의 파일은 같은 디렉토리에 만들어 줍니다. 메인이되는 test.c파일과 모듈이되는 myfun.c 파일 그리고 myfun모듈의 존재를 알려주는 myfun.h 헤더파일입니다. test.c에 헤더 선언 #include 를 하고 이 파일이 있는 디렉토리에서 명령어 프롬프트를 열어줍니다. 물론 윈도우 환경변수에 gcc컴파일의 위치를 넣어주셔야합니다. 2013/11/28 - [프로그래밍/c++] - MinGw을 사용해보자 명령어 프롬프트에서 위와 같이 컴파일을 해줍니다. -o 옵션은 실행파일의 이름을 지정합니다. -g 옵션은 컴파일후 링크까지 합니다.(실행파일 만듬) -c 목적파일까지..

C언어 좌변값[팁]

컴파일을 하다보면 lvalue require~ 어쩌구 하는 에러를 보게된다. 무심코 넘어갈 수 있는데 lvalue에 대해서 관찰해보자. 어떤 글에서 보니 사람마다 코딩에 흔적을 남긴다고 한다. 구두점의 위치나 공백습관, 주석형태 등등 많을 것이다. 말하고자 하는 바가 프로그래밍 언어와 사람 말하는 언어습관을 비교하는 것인지 모르겠지만, 코딩을 할때 실제 말하는 것처럼, 습관적으로 하는 코딩습관이 있을 지 모른다. 문법이 확실하지 않아도, 그렇게 말해도, 또는 그렇게 코딩해도 별 문제없이 사용했을 지도 모른다. 실제 언어야 어떻게든 의미만 전달하면 되겠지만, 프로그래밍 언어는 작은 실수라도 에러기때문에 문법에 대해서 끝임없이 숙지하고 생각해야 한다 생각한다. lvalue라는 건 좌변값이라고 말한다. 그럼 ..

상수포인터, 포인터상수, const

상수포인터와 포인터상수의 차이 포인터와 배열을 배우다 보면 상수포인터와 포인터상수라는 용어를 많이 듣게 됩니다. 단어만 생각하면 순서만 바뀐 용어인데 뜻은 어떤지 알아볼까합니다. /* 2014 9/19 추가부분 영어로 관련표현은 constant pointer - 포인터의 값이 상수인 포인터 pointer to constant - 상수를 가리키는 포인터 constant pointer to constant -상수를 가리키는 constant pointer 3가지입니다. 제가 여러책을 본 결과 한국어 번역으로 ,포인터상수와, 상수포인터는 번역상의 차이지 결국은 같은 의미로 혼용되고 있다고 생각이듭니다.어떤 책에서는 배열변수명이 포인터 상수라고하고 어떤 책에서는 상수포인터라고합니다. 어떤 책에서는 이에 대한 언급..

C언어 포인터에 대한 이해(3)

포인터 연산 c언어 포인터에 대한 이해 3번째 포스팅 이네요. 포인터란 녀석은 참 단순하지만, 완벽히 이해하지 못하면 골머리 썩는 녀석입니다. 그만큼 c언어에 있어서 포인터란 녀석은 자주 쓰이기 때문이죠. 간혹 포인터를 안쓰고 프로그래밍을 한다는 분도 계시지만, 포인터를 안쓰는건 물감없이 수채화를 그리는 것과 다름없다 생각듭니다. '그럼 이렇게 골머리썩는 포인터를 왜 써야하나요?' 이렇게 질문 하시겠죠? 저는 왜 써야하는지 보단, 포인터가 없다면 많을 것들을 할 수 없기 때문이라 생각됩니다. 물론 포인터말고 좀 더 쉬운 개념의 어떤 문법이 생길지도 모르겠지만, 지금으로서는 포인터로 인해 많은 것들을 할 수 있고, 그런 것들을 경험으로써 익혀 나가게 된다면 포인터는 정말 필요하구나 라고 차차 느껴나가실 겁..

C언어 포인터에 대한 이해(2)

저번 포스팅에 이어 포인터에 대해 쓰려합니다. 저번 포스팅은 포인터의 가장 기본이 되는 사항을 체크해 봤습니다. 이번 포스팅은 주제를 좀 더 세분화하여 심화해 보겠습니다. 포인터의 타입의 의미 2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1) 에서 타입이 왜 필요한지 스치 듯 설명했습니다. 포인터의 타입은 포인터가 가리키는 대상체의 타입입니다. 간단하게 예를 들어 보겠습니다. p포인터는 arr배열을 가리키기 위해서 int형으로 선언되어 있습니다. 배열을 잘 모르시는 분을위해 간략한 설명을 하겠습니다. 참고 : 2013/05/25 - [프로그래밍/C언어] - 배열의 특징 C언어 arr[10] 에서 arr은 배열명으로서 arr[0]의 주소값을 의미하고, 배열 전체를 대표하는 배..

C언어 포인터에 대한 이해(1)

C언어를 사용하게되면 포인터에 대한 이해가 필수입니다. 그래서 천천히 정리도 할겸 글을 씁니다. 그전에 포인터를 그냥 공부하기보단 왜 포인터가 필요한가를 느껴야지 더 와닿지 않을까 생각합니다. 저도 한동한 손을 놓고 있던지라 생각나는대로 정리를 하겠습니다. 포인터는 정말 유용한 도구인데요, 우선 포인터의 정의를 알아야 하겠습니다. 포인터는 번지값을 가지는 변수입니다. Type *P; 여기서 *는 포인터 변수를 선언하는 구두점입니다. Type은 포인터 변수가 가리키는 주소에 선언된 변수의 타입을 나타냅니다. 포인터변수는 주소값만을 취하기때문에 포인터변수의 크기는 항상 4byte로 일정합니다.(여기서 4byte는 32비트시스템에 해당함) 번지값을 갖는것은 의미가 참 큽니다. 그림으로 생각해야 이해가 쉬우니 ..

포인터사용시 주의점2

일반적으로 포인터는 특정 변수를 가르킨다. 그리고 이 포인터가 가르키는 변수는 타입이 정해져서 그 변수가 담고있는 내용은 틀에 맞춰 끼워진내용이란말이다. 다시말해 형식이 정해져있는 내용이다. 예를들어 int형 변수를 가르키는 포인터는 그변수가 int형(4Byte)를 가르키기때문에 그에 맞춰 변수의 주소값과 변수의 타입명을 확실히 알고 값에 접근할 수가있다. 이제부터 쓰는 내용은 이런 확실함에 대한 이야기다. 내부적으로 컴파일러의 설계에 따라 달라질 수 가 있을지모르겠고, 난 전혀 컴파일러를 설계해보지 않았기때문에 경험적으로 말하는 것임을 미리 말해둔다. char* str; 위선언은 무척 많이 보았을것이다. 위선언을 보고 동적할당을 해야겠구나. 라고 생각을 한다면, 어느정도 기본을 충실히 한 사람일 것이다..

반응형