c언어 독학 EOF
c언어 독학 EOF 취미생활로 c언어 독학을 하고 있는데 그동안 문자열을 입력받고 출력할 때는 scanf()와 printf() 함수를 이용했습니다. 하지만 이 녀석들은 메모리의 공간도 많이 차지하고 연산의 양이 많은 단점이 있어서 하나의 문자만 입력받고 출력할 때는 putchar, fputc, getchar, fgetc 함수를 이용하는 게 좋기 때문에 지난 글에서 이 함수들의 쓰임새를 대충 살펴봤습니다. 그런데 문자를 문자를 입. 출력 하는 함수인데 반환형이 int형인 게 좀 이상합니다. int getchar(void); int fgetc(FILE*stream); ■ 왜 반환형이 int형 일까요? 그 이유를 대충 살펴보겠습니다. C언어에는 파일의 끝을 표시하기 위해서 EOF(End Of File)라는 상..
C언어 독학 포인터 배열
C언어 독학 포인터 배열 ■ 포인터도 변수의 메모리 주소를 저장하는 일 종의 변수이다. 그렇기 때문에 이 또한 배열로 저장할 수 있는데 일반 변수의 배열과 크게 다르지 않기 때문에 간단한 예제를 통해서 그 내용을 알아보고 이중 포인터가 필요한 이유에 대해서 정리해본다. 먼저 선언하는 형식은 다음과 같다. int * aaa[10]; ▲ 길이가 10인 int형 포인터 변수이다. aaa가 가리키는 것은 첫 번째 요소 aaa[0]의 주소인데 이는 이는 싱글 포인터의 주소이기 때문에 aaa는 더블 포인터가 된다. 예제에서 확인해본다. ▲ 세 개의 변수를 선언 및 초기화하고 각각의 주소를 가리키는 aa, bb, cc를 선언하고 있다. 그리고 int형 pabc를 선언하고 세 개의 포인터 변수로 초기화하고 있는데 이때..
C언어 독학 배열의 길이 없이 초기화하기
C언어 독학 배열의 길이 없이 초기화하기 C언어에서 배열은 1차원과 다차원(2차원)이 있는데요. 이 배열들을 초기화하는 과정은 거의 비슷하다는 걸 지난 글에서 확인해봤습니다. '거의' 같다는 건 다른 점도 있다는 뜻이겠죠?^^ 몇 가지 차이점 중에서 이번 글에서 알아볼 배열의 길이를 알려주지 않고 초기화하는 방법이 조금 차이가 있습니다. 예를 들어 1차원 배열은 다음과 같이 길이를 명시하지 않고 초기화하면... int x []={1, 2, 3}; ▲ int형 배열 x의 길이가 3이라는 걸 컴파일러가 자동으로 찾아줍니다. 하지만 2차원 배열은 조금 다른데요. 지난 글에서 정리했듯이 2차원 배열은 행과 열로 값들이 위치하게 되는데... int y[][]={1, 2, 3, 4, 5,6}; ▲ 이렇게 행, 열의..
C언어 독학 다차원 배열
이번 글에서는 C언어의 다차원 배열의 기본 개념을 정리해볼까 합니다. 1차원 배열은 같은 자료형을 메모리상에 한 줄로 연속으로 나열하는 방식으로 데이터를 저장해서 관리를 용이하게 해주는 역할을 하는데요. 다차원 배열(일반적으로 2차원 배열)은 가로와 세로로 데이터를 저장하게 됩니다. 아파트 구조를 생각하면 이해하는데 도움이 좀 될 겁니다. 3층짜리에 각 층마다 2가구가 산다면 3행(층) 2열(가구)가 되겠죠? C언어에서 다차원 배열도 같은 형식으로 저장이 되고 2차원 배열의 선언 형식은 다음과 같습니다. int apt[3][2]; 이렇게 2차원 배열을 선언하면 세로가 3, 가로가 2인 2차원 배열이 되는 건데요. apt[0][0] apt[0][1] apt[1][0] apt[1][1] apt[2][0] a..
c언어 독학 const
c언어 독학 const 이번 글에서는 C언어 const를 포인터 변수에 선언하는 개념을 정리해볼까 합니다. const는 어떤 값이 변경되지 못하도록 상수로 선언하는 건데요. 포인터 변수에도 똑같이 적용할 수 있습니다. 포인터 변수를 이용하면 변수에 저장된 값도 변경할 수 있고, 포인터 변수에 저장된 변수의 주소 값도 변경할 수 있는데 이런 것들을 못하게 막아버리는 것입니다. 먼저 포인터에 저장된 변수의 주소 값을 변경하는 경우입니다. ▲ 예제에서는 int형 변수 x, y를 선언하고 각각 100과 200으로 초기화하고 있으며 포인터 변수 aa를 선언해서 그곳에 x의 주소 값을 저장하고 있습니다. 그리고 바로 이어서 aa에 x대신 y의 주소 값을 대입하고 있으며 결과가 제대로 출력이 되는 걸 확이할 수 있습..
C언어 독학 배열을 인자로 전달하기
C언어 독학 배열을 인자로 전달하기 배열이란 같은 자료형을 여러 개 모아 놓은 데이터의 형식인데요. 이 데이터를 함수에 인자로 전달할 수 있을까요? 지금까지 공부하면서 정리했던 대로 배열의 이름은 포인터 변수와 와 똑같은 역할을 하기 때문에 배열의 이름을 인자로 전달하면 그 배열의 첫 번째 요소의 주소 값이 전달됩니다. 하지만 함수에서는 매개변수로 배열을 사용할 수 없기 때문에 난관에 부딪치게 되는데요. 이때 매개변수에 포인터 변수는 사용할 수가 있습니다. 즉 배열로 전달하고 포인터 변수로 받아서 그 주소 값을 찾아가면 되는 거예요. 포인터 변수와 배열은 모두 변수의 메모리상의 주소 값을 저장하는 역할을 하기 때문에 가능한 것입니다. 말이 좀 어렵네요. ㅎㅎ 그래도 배열을 전달하고 포인터 변수로 받으면 ..
C언어 독학 포인터 연산
C언어 독학 포인터 연산 포인터는 변수의 메모리 주소를 저장하는 것입니다. 그렇다면 이 포인터 변수를 증가 또는 감소하면 어떻게 될까요? 포인터 변수에 저장된 건 메모리 주소이기 때문에 해당 자료형의 크기만큼 증가 또는 감소하게 되는데요. 예를들어 int형 포인터라면 1을 더하면 4byte 만큼 값이 변경 되는 것입니다. 예제에서 확인해볼게요. ▲ 요소가 세 개인 int형 배열 a를 선언하고 각각의 값을 초기화하고 있으며 포인터 변수 b에 그 주소를 저장하고 있습니다. 그리고 그 주소를 확인하기 위해서 printf() 함수로 주소를 출력하고 있는데요. 0015F9E4 이네요. 그리고 이 주소를 저장하고 있는 포인터 변수 b에 +1을 해봤습니다. 그랬더니 정확하게 4byte가 증가하는군요. 이 4byte가..
C언어 독학 배열 이름은 포인터이다
C언어 독학 배열 이름은 포인터이다 ■ 배열은 같은 자료형의 데이터를 메모리에 연속으로 저장하는 것이고 포인터는 특정 변수의 메모리상의 주솟값을 저장하는 것인데요. 글의 제목처럼 배열 이름이 포인터라면 배열도 값이 저장된 메모리의 주솟값을 저장하고 있다는 의미겠죠? 다음 예제를 통해서 그 결과를 확인해보겠습니다. ▲ a [] 배열에 int형 자료형 세 개를 저장하고 있는데요. 서식 문사 "%p"를 이용해서 각 요소들의 값을 출력해보겠습니다. 그리고 배열의 이름 a의 값도 출력해볼게요. ▲ 이 프로그램의 실행 결과에서 알 수 있듯이 배열의 이름이 가리키고 있는 주소와 배열의 첫 번째 요소가 가리키고 있는 주소의 위치가 같습니다. 즉, 배열의 이름은 저장된 메모리의 첫 번째 요소의 주소값을 저장하고 있다는 ..
c언어 독학 포인터 변수의 초기화
c언어 독학 포인터 변수의 초기화 ■ 어떤 변수든 선언할 때 또는 나중에 값을 넣어서 초기화를 해줘야 하는데요. 다른 변수에 비해서 포인터 변수는 이 초기화에 특히 주의를 해야 합니다. 이 녀석을 이용하면 메모리의 특정 주소에 직접 접근할 수도 있고 그곳에 저장된 값을 변경할 수도 있기 때문인데요. 만약에 포인터 변수를 초기화하지 않고 값을 대입해버리면 어떤 결과가 나올까요? 예제에서 확인해볼게요. ▲ int 변수 x를 선언하고 100으로 초기화 한 후 int형 포인터 변수 aa를 선언하고 초기화를 하지 않은 상태에서 *aa를 이용해서 aa가 가리키고 있는 메모리에 200을 대입하고 있습니다. 그리고 그곳에 *aa에 200이 제대로 대입됐는지 확인하기 위해서 값을 출력하고 있는 모습입니다. 이 프로그램은..
c언어 프로그래밍 포인터 변수 선언과 &, * 연산자의 역할
■ C언어에서 변수를 선언하면 메모리의 어느 한 곳에 위치하게 되는데 그곳의 주소를 가져와서 저장할 수 있는 것이 포인터 변수입니다. 이 포인터 변수를 이용하면 메모리에 저장된 변수의 값에 접근할 수도 있고 변경할 수도 있습니다. 이때 사용되는 연산자들이 있는데 변수의 값이 저장된 메모리 주소를 반환하는 연산자가 "&"이고, 그 변수의 주소에 직접 접근할 수 역할을 하는 게 "*" 연산자 입니다. 예제에서 이것들을 이용해보겠습니다. 먼저 포인터 변수를 선언할 건데요. 선언 방법은 다음과 같습니다. 자료형 * 포인터 변수 이름; ▲ int형 변수 aa를 선언하고 100으로 초기화하고 있는데요. 이 변수의 주소값을 저장할 포인터 변수 pa를 형식에 맞게 선언하고 있습니다. 이제 pa에 aa의 주소를 저장하겠..
c언어 독학 포인터 변수
■ c언어에서 포인터 변수도 어떤 값을 저장하기 위한 변수의 한 종류인데 여기에는 다른 변수의 메모리 주소값이 저장됩니다. 일단 이렇게 개념을 잡고 예제에서 int형 변수를 하나 선언하고 초기화 한 후 그 값이 저장된 메모리의 주소값을 불러와서 포인터 변수에 저장하고 출력하는 과정을 통해서 포인터 변수를 알아보겠습니다. ▲ int x를 선언하고 10으로 초기화하고 있고, [int * a=&x;]로 int형 포인터 변수 a를 선언하고 그 값을 x의 주소값을 불러와서 초기화하고 있는데요. 포인터를 선언하는 방법은 그림과 같이 [자료형 * 포인터 이름] 형식입니다. 그리고 거기에 저장될 주소값을 불러올 때는 "&'연산자를 사용합니다. 이렇게 선언하고 초기화한 a에 저장된 메모리 주소값을 출력하기 위한 서식 문..
C언어 독학 배열로 문자열 표현하기
C언어 독학 배열로 문자열 표현하기 ■ C언어에서 문자열을 표현할 때는 큰따옴표("")를 이용하는데요. char 배열을 이용해서 문자열을 저장하고 변경할 수 있는데 간단한 코딩을 해보면서 그 과정을 확인해보겠습니다. 먼저 char 배열에 문자열을 저장하겠습니다. ▲ char 배열 str에 길이를 지정하지 않고 문자열을 입력하고 있습니다. 이렇게 길이를 지정하지 않으면 컴파일러가 문자열을 체크한 후 그 길이를 자동으로 지정해주는데요. 1byte의 char의 길이를 확인하기 위해서 sizeof() 연산자를 사용하고 있습니다. 프로그램을 실행하면 다음과 같은 결과가 출력되는데요. ▲ str 배열의 크기는 8byte이군요. 1byte 짜리 데이터가 8개 있다는 소리인데.... 좀 이상합니다. "Hello~!" ..
C언어 독학 함수 만들기 function return
C언어 독학 함수 만들기 function return ■ 지난 글에서 C언어 함수의 개념을 정리해봤는데요. 함수는 '전달 인자'와 '반환 값'의 유무에 따라서 네 가지로 구분할 수 있습니다. 이번 글에서는 첫 번째로 전달인자와 반환값이 모두 있는 일반적인 함수를 만들어보겠습니다. 예제는 전달된 인자를 더해서 그 값을 반환하는 형태의 함수인데요. 다음과 같은 특징으로 만들겠습니다. 전달되는 인자는 int 형으로 두 개이며 함수의 이름은 Hap이고 실행후 반환되는 값도 int형입니다. 위의 형태를 참고해서 함수를 만들면 다음과 같은 형식이 될것입니다. int Hap(int su1, int su2){ int res=su1+su2; return res; } ■ 함수의 매개변수 int su1과 su2를 선언해서 ..
c언어 독학 do~while
c언어 독학 do~while ■ 지난 글에서 while문에 대해서 정리해봤는데요. while문은 앞쪽에서 조건문을 검사해서 참이면 실행하고 거짓이면 실행하지 않는 형식인데요. 이번 글에서 알아볼 do~while문은 조건을 뒤쪽에서 검사한다는 차이점이 있습니다. 그렇기 때문에 최초 한 번은 무조건 실행하게 되며 형식은 다음과 같습니다. do{ 실행할 코드; }while(조건문); 예제를 만들어서 확인해보겠습니다. ▲ 앞에서 알아본 형식대로 먼저 printf() 함수가 실행되고 문자열이 출력될 것입니다. 그리고 while문과 마찬가지로 반복문을 빠져나올 수 있도록 x++; 연산문을 입력하고 있습니다. 프로그램이 실행되면 x=0으로 초기화하고 printf()를 실행된 후 x를 증가시켜서 x=1이 됩니다. 다음..
c언어 독학 scanf() 함수
c언어 독학 scanf() 함수 ■ c언어에서 출력을 위한 함수로 printf()가 있으며 지난 글에서 개념 정리를 해봤었는데요. 이번 글에서는 입력을 담당하는 scacnf() 함수에 대해서 알아보도록 하겠습니다. 프로그램은 사용자로 하여금 어떤 데이터를 입력받는 경우가 많은데 크게 정수와 실수, 그리고 문자열 입력이 가장 대표적이겠죠? 아직은 개념 정리 단계이므로 정수와 문자열만 간단하게 입력받아서 저장했다가 출력하는 예제를 만들어보면서 scanf() 함수에 대해서 개념을 잡아보겠습니다. 데이터를 입력받을 때도 서식 문자를 사용하는데요. 정수의 입력 형식은 다음과 같습니다. [%d=10진수], [%o=8진수], [%x=16진수] 다음은 실수의 서식 문자~ [%f=float], [%1f=double], ..
c언어 독학 변수 선언
c언어 독학 변수 선언 ■ C언어에서 변수는 데이터를 저장하는 메모리상의 공간을 의미하는데 변수를 선언함으로써 메모리에 공간이 할당된다. 그 공간에는 데이터를 저장할 수도 있고, 저장된 값을 참조할 수도 있는데 이런 변수를 선언할 때 주의해야 할 사항이 몇 가지 있는데 간단하게 정리해본다. 먼저 변수의 이름을 정할 때는 변수가 하는 기능과 어울리는 이름을 지어주는 게 좋다. 예를 들어 국어, 영어, 수학 등 과목의 점수를 저장하기 위한 변수는 kor, eng, mat 등.... 의미를 알아볼 수 있게 지어주는 게 좋다. 이렇게 변수의 이름을 정할 때 주의할 점이 몇 가지 있는데 다음과 같다. 1. C언어는 알파벳 대문자와 소문자를 구분하기 때문에 abc 변수와 ABC 변수는 엄연히 다른 것이다. 2. 변..