C언어 기초 ws2_32.lib 추가
C언어 기초 ws2_32.lib 추가 윈도우에서 FormatMessage()와 WSAGetLastError()를 이용해서 에러 정보를 확인할 수 있는데요. WSAGetLastError()를 호출해서 에러를 의미하는 정수형이 리턴되는데 이때 이 숫자의 의미를 알기 위해서는 FormatMessage()를 사용해야 하는 것입니다. 윈도우에서 이 함수들을 사용하기 위해서는 ws2_32.lib를 프로젝트 라이브러리 파일에 추가해줘야 하는데요. 그 과정을 정리해볼까 합니다. ■ 제가 사용하는 컴파일러는 [visual studio 2010]이거든요. 프로젝트 속성에서 라이브러리를 추가하는 과정은 다음과 같습니다. ▲ 프로젝트를 마우스 우클릭해서 [속성] 메뉴로 이동하구요. ▲ 속성 페이지에서 [링커] ▶ [입력]을 ..
c언어 프로그램 main() 함수 인자 전달
c언어 프로그램 main() 함수 인자 전달 지금까지 C언어 프로그램을 공부하면서 main() 함수에는 인자를 전달하지 않은 기본 형태만 사용해왔는데 main() 함수도 인자를 전달할 수 있고 이를 확인하기 위해서는 프로그램을 실행하는 방법이 조금 차이가 있거든요. 그 과정을 정리해볼까 합니다. 먼저 다음과 같이 main() 함수에 인자를 전달할 수 있습니다. ▲ 제한적이긴 하지만 이렇게 문자열 인자를 전달할 수 있고 첫 번째 int는 전달되는 인자의 개수를 의미하고 bb[]는 문자열 배열을 받는 매개변수입니다. 이 함수에 인자를 전달하기 위해서는 CMD에서 응용프로그램(exe)을 실행한 후 입력해야 하는데 먼저 응용프로그램의 위치를 찾아볼게요. ▲ 사용 중인 컴파일러에 따라서 조금씩 다르겠지만 Visu..
C언어 기초 함수 포인터
C언어 기초 함수 포인터 이번 글에서는 C언어 기초 중에서 함수 포인터에 대해서 기본 개념과 선언하는 방법을 알아보겠습니다. 우리가 정의하는 함수도 변수와 마찬가지로 메모리에 저장되는데요. 함수의 이름이 그 주소 값을 의미하는 것입니다. 즉, 이 주소 값을 저장하기 위한 별도의 함수 포인터를 선언할 수 있습니다. 함수 포인터도 선언하기 위해서는 먼저 포인터 형을 결정지어야 하는데 다음과 같은 함수가 있다고 가정해볼게요. int aaa(int x){...} 이 함수는 반환형과 매개변수 모두 int형인 aaa라는 함수입니다. 그리고 앞에서 정의한 대로 'aaa'는 이 함수의 메모리상의 주소 값을 저장하고 있는데요. 함수 포인터는 이 반환형과 매개변수를 기준으로 포인터 형을 결정짓습니다. 그래서 이 함수의 주..
c언어 기초 프로그래밍 2차원 배열 이름이 가리키는 것들
c언어 기초 프로그래밍 2차원 배열 이름이 가리키는 것들 C언어의 2차원 배열 이름에 관한 이야기를 좀 해볼까 한다. 그전에 간단하게 1차원 배열 이름에 대해서 정리하고 넘어가 보자. 1차원 배열의 이름이 가리키는 것은 첫 번째 요소이며 이는 포인터와 같은 역할을 한다. 그리고 이 배열을 인자로 전달할 때 호출되는 함수에서는 포인터 변수로 받아서 배열에 접근해야 한다. int aaa[3]; ▲ 여기서 aaa 이름이 의미하는 것은 aaa[0]의 주소 값이다. 다시 말해 aaa와 aaa[0]은 같다. 하지만 2차원 배열은 그렇지가 않은데 그 과정을 정리해볼까 한다.그렇다면 2차원 배열의 이름이 가리키는 것은 무엇일까? 이도 마찬가지로 첫 번째 요소 [0][0]을 가리키는 것은 동일하다. 먼저 이 부분부터 확..
C언어 독학 이중 포인터
C언어 독학 이중 포인터 포인터란 어떤 변수의 메모리상의 주소값을 저장하는 변수입니다. 그리고 포인터 자체도 변수이기 때문에 메모리에 자리를 잡게 되고 이 녀석도 자기의 주소값을 갖게 됩니다. 그렇기 때문에 포인터 변수를 대상으로 '&'연산이 가능하며 반환되는 이 녀석의 주소 값을받아서 저장할 수 있는 것을 이중 포이터라고 합니다. 즉, 포인터 변수를 가리키는 또 다른 포인터인데요. 선언하는 형식은 다음과 같습니다. int **aaa= &포인터변수; *연산자를 두 개 입력하면 되는데 예제에서 작성해보겠습니다. int형 변수 su를 10으로 초기화하고 이 변수의 주소를 poi에 저장하고 있습니다. 그리고 다시 poi의 주소를 dpoi에 저장하고 있는 모습인 이중 포인터 공부하시면 싱글 포인터는 이미 보셨을..
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언어 다차원 배열 초기화 2차원 배열은 행과 열의 형태로 생성되지만 메모리상에는 1차원과 같이 순서대로 할당되는 걸 지난 글에서 확인했었는데요. 이번에는 다차원 배열을 초기화하는 방법을 정리해볼까 합니다. 이 방법은 몇 가지가 있지만 기본 형식은 1차원과 비슷한데요. 먼저 1차원 배열을 잠깐 살펴보겠습니다. int aaa[]={1, 2, 3 }; 이렇게 초기화 리스트 안에 입력한 순서대로 데이터가 할당되고 선언한 배열의 수와 초기화한 값이 다를 때는 나머지는 '0'이 대입됩니다. int bbb[5]={1, 2, 3}; ◀▶ int bbb[5]={1, 2, 3, 0, 0}; 1차원 배열을 공부하셨다면 이 두 가지 경우가 같다는 건 아실 겁니다. 2차원 배열 정리한다고 해놓고 왜 이렇게 1차원 이야기를 하..
C언어 다차원 배열 메모리 할당 형태는?
C언어 다차원 배열 메모리 할당 지난 글에서 다차원(2차원) 배열은 가로와 세로 형태로 배열이 생성되는 걸 확인했었는데요. 그렇다면 이 데이터들이 메모리에 저장될 때는 어떻게 할당 될까요? 컴퓨터의 메모리는 1차원 구조이기 때문에 2차원 배열의 형식으로 데이터를 저장하지는 못하고 순서대로 1차원 구조로 저장됩니다. 예를 들어 다음과 같은 2차원 배열이 있다고 가정해볼게요. int arr[3][2]; 이 배열은 3행 2열의 형태로 배열이 생성되지만 메모리상에는 int arr[0][0], int arr[0][1]..... int arr[2][1] 순서대로 메모리에 저장됩니다. 이 내용을 확인해보기 위해서 간단한 예제를 만들어보겠습니다. 2차원 배열을 선언하고 각 요소의 메모리 주소값을 출력해보는 예제입니다...
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언어 프로그래밍 인자로 전달되는 값
C언어 프로그래밍 인자로 전달되는 값은 복사 값 C언어에서 함수를 호출할 때 어떤 데이터를 넘겨주면서 그것을 대입해서 함수를 실행하도록 하는 경우 전달되는 값을 인자라고 하는데요. 함수에는 같은 같은 자료형의 변수... 즉, 매개변수에 그 값을 저장했다가 이용하게 됩니다. 다음 예제에서 이 개념을 확인해보겠습니다. ▲ main() 함수에서 int형 변수 su1과 su2를 선언과 초기화 한 후 hap()이라는 함수를 호출하면서 그 값을 전달하고 있습니다. 그리고 호출되는 함수에서는 두 값을 받아서 더해서 출력하고 있는 내용입니다. 이렇게 값을 전달하고 받아서 함수를 실행하게 되는데..... 여기서 중요한 내용은 hap()을 호출하면서 전달한 값 su1과 su2입니다. 이 녀석들은 정말로 su1과 su2에 ..
C언어 프로그램 포인터 배열
C언어 프로그램 포인터 배열 ■ 포인터도 변수이다. 데이터가 저장된 메모리의 주소를 저장하는 변수이기 때문에 포인터도 배열을 선언할 수 있으며 선언 방식은 다음과 같다. int * aaa[10]; double * bbb[20]; 이렇듯 선언하는 방법은 일반 변수의 배열을 선언하는 방법과 같다. 이렇게 배열로 선언된 포인터를 이용하는 예제를 간단히 만들어본다. ▲ int형 변수 su1~su4까지 각각 값들을 초기화하고 이 변수들의 주소 값을 저장할 arr 포인터 변수의 배열을 선언하고 있으며 각 주소 값으로 초기화 하고 있다. 그리고 * 연산자로 각각의 요소에 접근해서 저장된 값을 출력하고 있는 내용인데 프로그램을 실행하면 각각의 변수에 저장된 값이 순서대로 출력되는 걸 확인할 수 있다. 이처럼 포인터도 ..
c언어 독학 포인터 변수의 초기화
c언어 독학 포인터 변수의 초기화 ■ 어떤 변수든 선언할 때 또는 나중에 값을 넣어서 초기화를 해줘야 하는데요. 다른 변수에 비해서 포인터 변수는 이 초기화에 특히 주의를 해야 합니다. 이 녀석을 이용하면 메모리의 특정 주소에 직접 접근할 수도 있고 그곳에 저장된 값을 변경할 수도 있기 때문인데요. 만약에 포인터 변수를 초기화하지 않고 값을 대입해버리면 어떤 결과가 나올까요? 예제에서 확인해볼게요. ▲ int 변수 x를 선언하고 100으로 초기화 한 후 int형 포인터 변수 aa를 선언하고 초기화를 하지 않은 상태에서 *aa를 이용해서 aa가 가리키고 있는 메모리에 200을 대입하고 있습니다. 그리고 그곳에 *aa에 200이 제대로 대입됐는지 확인하기 위해서 값을 출력하고 있는 모습입니다. 이 프로그램은..
c언어 독학 포인터 변수
■ c언어에서 포인터 변수도 어떤 값을 저장하기 위한 변수의 한 종류인데 여기에는 다른 변수의 메모리 주소값이 저장됩니다. 일단 이렇게 개념을 잡고 예제에서 int형 변수를 하나 선언하고 초기화 한 후 그 값이 저장된 메모리의 주소값을 불러와서 포인터 변수에 저장하고 출력하는 과정을 통해서 포인터 변수를 알아보겠습니다. ▲ int x를 선언하고 10으로 초기화하고 있고, [int * a=&x;]로 int형 포인터 변수 a를 선언하고 그 값을 x의 주소값을 불러와서 초기화하고 있는데요. 포인터를 선언하는 방법은 그림과 같이 [자료형 * 포인터 이름] 형식입니다. 그리고 거기에 저장될 주소값을 불러올 때는 "&'연산자를 사용합니다. 이렇게 선언하고 초기화한 a에 저장된 메모리 주소값을 출력하기 위한 서식 문..
c언어 프로그래밍 scanf 함수로 문자열 입력
c언어 프로그래밍 scanf 함수로 문자열 입력 ■ c언어에서 데이터를 입력받는 함수 중 하나가 scanf()인데요. 이 녀석을 이용해서 정수를 입력받을 때는 다음 예제와 같이 저장할 변수 앞에 "&"를 붙여줘야 합니다. ▲ 정수를 입력받아서 'x' 변수에 저장하고 있는 과정인데 이렇게 x에 정수를 저장하기 위해서 "&"연산자를 붙이고 있습니다. 하지만 문자열을 입력받을 때는 "&" 연산자를 붙이지 않습니다. 좀 더 자세한 내용은 포인터 정리할 때 다시 언급하기로 하고 일단 이렇게 암기하고 넘어갈게요. c언어에서는 문자열을 출력할 때 서식 문자 "%s"를 이용하듯이 입력받을 때도 마찬가지 입니다. 예제를 만들어서 확인해보겠습니다. ▲ 길이가 50인 char 배열 str을 선언하고 있으며 문자열을 입력받기..
c언어 배열 초기화 array initialization
c언어 배열 초기화 array initialization ■ 지난 글에서 c언의 배열의 개념과 선언 방법 등을 정리해봤는데요. 이번에는 배열을 선언과 동시에 초기화를 하면서 배열의 몇 가지 특징을 정리해보겠습니다. 먼저 선언과 동시에 초기화하는 방법은 다음과 같습니다. int aaa[3]={1, 2, 3}; 이런 형식인데요. [] 안에 3은 배열의 길이를 의미하고 1, 2, 3이 순서대로 저장됩니다. 이게 c언어 배열 초기화 기본 형식이rh요. 만약 길이를 의미하는 [3]을 입력하지 않은 상태에서 초기화 리스트{}의 값들을 입력하면 컴파일러에 의해서 자동으로 3이라는 길이가 저장됩니다. int bbb[]={1, 2, 3}; 앞에서 정의한 배열과 완벽하게 동일한 형식입니다. 참고하시고요. 다음은 선언한 길..
c언어 배열 선언 array
c언어 배열 선언 array ■ 배열이란 동일한 자료형의 변수를 여러 개 모아놓은 것인데요. 배열을 선언할 때는 이름, 자료형, 길이 정보가 필요하며 형식은 다음과 같습니다. int aaa [3] ◀ 자료형 배열이름 [배열길이] 즉, 배열을 이루는 요소들의 자료형과 배열의 이름 그리고 몇 개의 변수를 모아 놓을 것인지 길이를 지정해주면 됩니다. 위 형식처럼 배열을 선언하면 int형 자료형 세 개를 모아놓은 'aaa'라는 배열을 선언한 것입니다. 이렇게 배열을 선언하면 메모리의 어느 공간에 세 개의 변수가 위치하게 되는데 연속으로 위치하게 됩니다. 예를 들어 첫 번째 변수의 위치가 10억 번지라면 두 번째는 10억1번지 세 번째는 10억 2번지가 되는겁니다. ■ 그래서 아무리 긴 배열이라고 해도 순서대로 ..