함수의 선언과 정의 함수에는 ‘선언’과 ‘정의’가 있다. 여기서 함수의 선언은 문법에 속하고, 함수의 정의는 실제와 관련되어 있다. 다시 말해서 선언은 함수의 설계고, 정의는 함수의 구연이다. 이 선언과 정의를 합쳐서 함수를 만들었다 할 수 있는 것이다. 근데 함수만 만들어서 무엇을 할까? 구슬이 서 말이라도 꿰어야 보배라고 하듯이, 함수를 이렇게 사용하는 것을, ‘호출‘이라고 하고 영어로 Call이라고 한다. 함수와 흐름 세로로 선을 긋고, 위에는 main()로 아래는 프로그램(p/g)의 마지막으로 쓴다면, 그 선이 아래로 가면서 printf같은 함수를 만나서 곡선으로 모양이 틀어졌다가 다시 원래의 선으로 돌아 올 것이다. 이때 반복되는 흐름을 어떤 것으로 대체해주면 어떨까? 사용자지정 함수가 바로 그..
hello world코드로 보는 함수 본격적으로 c언어를 들어갈 때 처음 배운 hello world를 출력하는 코드를 보자. 맨 처음 int main(void)로 시작하고 스코프{ }를 열어서 printf("Hello world!"; return 0;으로 마무리를 지어 준다. 이때의 main은 함수다. int는 정보를 뜻하고, main은 이름을 뜻하며, (void)는 매개변수를 뜻하며, 여기서 매개변수는 없다(void). 이 int는 반환하는 값으로 반환 자료형 이라고 한다. 이 반환되는 값은 return 0;에서 나온다. int 자료형 으로 0이 끝에 반환되는 것이다. 함수 예전에 함수(function)는 프로그램을 이루는 부품이나, 프로그램을 만드는 도구라고 함수에 대해 배우기 전에 가볍게 이해하는 ..
복습과 유의할 점 들어가기 전에 중요한 것이 있다. 지난시간에 배웠듯이 int anData == [2][3] = { ....... };로 다차원 배열을 했을 경우, 지난시간 anData[0]이나, anData[1]이나 주소 자체로 쓰인다고 했었다. (&가 붙지 않아도) 그래서 알 수 있는 점은 anData는 == anData[0]고, == &anData[0][0] 와 같다고 알 수 있겠다. 그리고 int *pnData;를 선언했으면, int 포인터를 선언했으니, pnData +1을 하면 int 한 개가 +된다. char *pszData라면, pszData + 1은 char값 1개가 더해지는 것이다. 다차원 배열의 포인터 변수 int anData [2][3] = {.....}; 와 같이 있으면, 이것을 포..
다차원 배열 2차원부터 3차원... n차원 배열을 다차원 배열이라고 하는데, 솔직히 쓰임은 3차원을 안 넘어 간다. 다차원 배열의 형식은 int anData[2][3];과 같은 경우가 되는데, 이때 [2]는 행이고 [3]은 열이 되겠다. x, y축으로 된 수직선의 좌표평면과 닮아있다. 이런 이차원 배열을 쓰는 이유는 아파트에 동과 호를 생각하면 편하다. 아파트의 집주소를 찾을 때 큰 의미로 동을 구별하고, 세세하게 호를 구별하게 동과 호를 만든 이유가 있는데, 이것이 다차원 배열의 쓰는 이유와 똑같다. 다차원 배열의 초기화는 int anData[2][3] = { {10,20,30}, {40,50,60} }; 과 같이 초깃값을 넣어줄 수 있다. 여기서 인덱스의 제로인덱스베이스 규칙으로 가로로는 행으로 0행..
배열 배열이란, 개수가 ‘n개’로 자료형이 있으면, 이 자료형이 1개면 변수지만, n개가 되면 배열이 된다. 배열과 포인터는 짝꿍으로 알고 있으라고 하는데, 사실 포인터도 배열과 같이 쓸 수 있기 때문에 둘의 경계가 별로 없는 이유에서다. 그래서 대부분의 강좌나 설명에서도 배열과 포인터를 같이 다룬다. 다만, 배열의 값과 포인터가 가리키는 값이 같지만, 포인터는 직접 값이 아니라, 주소로 유도하는 값이므로, 포인터는 관리, 배열은 사용에 목적을 둔다고 했었다. int, int, int, int인 int w, x, y, z;는 int라는 것 4개가 같이 있는 것으로, int [4]라고 줄일 수 있다. 이렇게 동일한 자료형이 여러 개 필요할 경우에, 그래서 자료형 여러 개를 선언할 경우, 하나 하나 일일이 ..
동적할당 RAM의 메모리를 쓰는 경우가 2가지가 있다고 했다. 변수와 동적할당이 이 2가지다. 그리고 메모리를 쓰고 받는 데는 3가지 과정이 있었다. 요구, 사용, 반환이 이 3가지다. 이것을 변수는 요구와 반환이 자동인데, 동적할당은 수동이다. 그래서 동적할당은 요구와 반환을 따로 함수로 해주어야 된다. 그렇지 않으면 영원히 반환이 안돼서 메모리가 해제될 때까지 계속 남아있는 릭(leak)이 생기게 된다. 그런 일이 발생하지 않으려면 free(); 함수로 메모리를 해제해야 된다. 그 메모리는 malloc(); 으로 동적할당을 하는 경우에서이다. 그러면 왜 동적할당을 할까? int nData[10]으로 변수를 선언했다고 하자. 이때 메모리는 4byte * 10으로 40바이트가 된다. 이 때 변수의 메모리..
다중포인터 pointer 변수는 말 그대로, 정보를 담는 변수지만, 그 정보가 주소라는 점에서 변수를 가리키는 역할을 한다. 여기서 포인터 변수의 중요한 점은 ~에 대한 포인터 변수라는 점인데, 이 ~이 char자료형이 되기도 하고, int자료형이 되기도 하지만, 특이하게도 char*가 되기도 한다. 이때에는 (char*) *라고 쓰는데 이 가로는 생략할 수 있어서 char * *로 쓸 수 있다. 이것은 2중 포인터고, char* **는 3중 포인터, char* ***4중 포인터 순으로 이어지는데, 사실 3중 포인터 까지만 해도 쓰는 사람이 문제를 내는 것 빼곤 없는 수준이기에, 2중 포인터만 봐도 무방하다. 이 모든 연속되는 포인터를 모두 ‘다중 포인터‘라고 한다. int 자료형이 있다면 그 자료형의 ..
알아두어야 할 점 char *pszData = "Hello"; 라는 식에서 pszData에는 무엇이 저장이 될까? 나는 그래도 변수니까 hello가 저장될 줄 알았는데, 사실은 hello가 저장되어있는 주소가 저장되는 것이다. hello는 배열로 배열의 기준인 h의 주소가 저장이 되는 것이다. (사실 []는 *와 똑같다. 다차원 배열은 예외) 그래서 char *pszData = "Hello"; 는 char *pszData = (H의 주소)[0]; 과 같다. 이 점 알아두고 예제를 들어가자. 예시 char szName[16] = {"Hong gildong"}; char *pszName = szName ; printf ("%c\n", szName[3]); 라는 식이 있다고 하자. 여기서 배열의 이름은 그냥 ..
다시 한 번 메모리에 대해서 설명하자면, 컴퓨터의 메모리는 32비트 플랫폼이면 그게 2^32byte의 메모리가 있는데 이것이 4GB고, 이 각각의 메모리에서는, 고유주소를 가지고 있다고 했다. 강의를 들어가면서 누누이 설명한 내용이니 영상의 마지막언급이므로 확실히 알아두자. 여기서 위치정보를 가지고 그 위치에 있는 정보를 가진 무언가를 접근하는 것이 ‘포인터’다. 사실 포인터와 배열은 거의 같다(==). 비유하자면, 그릇에 정보가 있는 것과, 그냥 정보만 있는 것의 차이다. 포인터 포인터는 지도, 단축아이콘, 별명, 또 다른 방법 등으로 비유해서 이해할 수 있다. 이 비유가 설명하는 점은, 포인터는 어떤 정보를 담는 그릇을 (위치정보, 고유주소로) 가리켜서 결국 가리키는 정보를 추가로 연결해주는 역할이다..
문자열과 배열 복습 문자와 문자열에는 중요한 차이가 많다. 문자는 %c, %d로 1개로 간단하지만, 문자열은 n개로 %s라는 특징이다. 여기서 배열과 주소, 문자열하면 빠질 수 없는 이야기다. 여기서 이 배열의 그릇을 가리키는 것이 포인터(Pointer)다. 포인터는 주소를 가리키는 것이 매우 중요하다. 우선은 포인터와 빠질 수 없는 배열에 대해 복습한다. 32bits에서는 2^32로 4GB를 가지고 있고, 이 메모리하나하나에 각각의 주소를 가지고 있다고 들어가는 강의 때 배웠다. char에서 문자열 6개를 선언한다면, 여기서 맨 왼쪽(가장 빠른 고유주소)이 기준이 되는 것이 중요하다. 그래서 110, 111, 112라는 세 주소가 있으면, 112는 110의 오른쪽으로 2칸이라고 해서 110+2라고 할 ..