C언어/C언어 문법 (51) 썸네일형 리스트형 [C언어] 동적할당 (stdlib.h, malloc, free) stdlib.h malloc 함수와 free 함수는 stdlib.h 헤더 파일에 포함되어 있다. 따라서 malloc 함수와 free 함수를 사용하기 위해서는 stdlib.h 헤더 파일 사용을 선언해 주어야 한다. 동적 할당 malloc 함수를 사용하면 해당 주소에 원하는 만큼의 메모리를 할당해 줄 수 있다. 예를 들어 int 형 포인터 변수인 ptr을 선언하게 되면 ptr에 4바이트의 메모리가 자동으로 할당되는데 이 메모리는 프로그램이 종료될 때까지 유지된다. 그러나 이러한 메모리가 많으면 메모리 부족 현상이 발생하므로 이를 방지하기 위해 메모리를 동적으로 할당할 수 있다. 동적으로 할당한 메모리는 free 함수로 해제할 수 있기 때문이다. malloc malloc 함수는 반환값으로 void 포인터를 반.. [C언어] 포인터 연산 포인터 연산 포인터 연산은 포인터 변수에 +, - 연산자를 사용하여 값을 빼거나 더하는 것을 의미한다. *, / 연산자는 사용할 수 없다. 포인터 변수는 메모리 주소를 가리키고 있는 변수이다. 따라서 포인터 연산을 하면 포인터 변수가 가리키고 있는 주소를 변경하게 되는 것이다. 포인터 연산은 포인터 자료형의 크기만큼 연산을 실행한다. 예를 들어 4바이트 크기의 int 형 변수의 주소 00A3FC00 를 가리키고 있는 포인터 변수의 값을 2만큼 증가시키면 00A3FC02 를 가리키는 것이 아니다. 00A3FC00 부터 00A3FC04 까지 변수가 저장되어 있기 때문에 제대로 된 값을 불러올 수 없기 때문이다. 따라서 포인터 변수의 값을 2만큼 증가시키면 00A3FC08 을 가리키게 된다. 위 내용을 코드로.. [C언어] 배열의 주소 배열의 주소 배열의 각 원소는 연속된 주소를 갖고 있다. 예를 들어 int 형 배열 arr[3] 를 선언했다고 가정해 보자. int 형 변수는 크기가 4바이트이므로 배열의 한 칸도 4바이트를 차지한다. 따라서 arr[0] 의 주소가 00A3FC00라면 arr[1] 의 주소는 00A3FC04 가 되고 arr[2] 의 주소는 00A3FC08 가 되는 것이다. 이를 그림으로 확인해 보면 다음과 같다. double 형 변수는 크기가 8바이트이므로 arr[3] 을 double 형 으로 선언했다면 다음과 같은 주소를 갖는다. 다차원 배열의 경우도 마찬가지로 모든 변수의 주소는 연속적이다. 그림으로 표현하자면 다음과 같다. 위 내용은 아래 코드로도 확인할 수 있다. #include int main() { int ar.. [C언어] 포인터 (단일, 다중포인터, 주소값, 참조와 역참조, 포인터배열) 포인터 모든 변수는 메모리 상에 할당되는 공간을 갖는다. 이 공간의 크기는 자료형에 따라 다르게 할당되고 각각의 자료형이 할당되는 위치는 모두 다르다. 이때 변수가 할당되어 있는 위치를 나타내는 것이 주소값이다. 다시 말해서 포인터는 변수가 메모리 상에 어느 위치에 저장되어 있는지를 나타낸다고 할 수 있다. 그리고 이것을 포인터가 변수를 '참조'하고 있다고 한다. 주소값과 포인터 주소값은 32비트 시스템의 경우에는 8자리의 16진수 0x00000000 ~ 0xFFFFFFFF 64비트 시스템의 경우에는 16자리의 16진수 0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF 으로 이루어져 있다. 이때 주소값이 나타내는 의미는 변수가 저장된 공간의 시작하는 부분이다. 따라서 long형 변수.. [C언어] 2차원배열, 다차원배열 다차원배열 1차원배열은 여러 개의 변수를 하나의 평면구조로 배열해 놓은 것을 의미한다고 했었다. 다차원배열은 이 1차원배열을 여러 개의 계층으로 나누어 놓은 것을 생각하면 된다. 다차원배열 선언 다차원배열의 선언은 1차원배열과 동일하게 자료형, 배열 이름, 배열의 길이를 필요로 한다. 배열의 길이를 작성할 때 원하는 차원의 개수 만큼 대괄호를 사용하여 명시해 주면 된다. 예를 들어 arr이라는 이름의 가로의 길이가 5이고 세로의 길이가 2인 정수형 2차원배열의 선언은 다음과 같이 할 수 있다. int arr[2][5]; 위 코드와 같이 선언하게 되면 2행 5열의 int형 배열이 선언된 것이다. 따라서 총 10개의 int형 변수를 저장할 수 있게 된다. 3차원배열은 2차원 배열과 마찬가지로 배열 이름 뒤에.. [C언어] 배열 배열 배열은 다수의 데이터를 하나의 이름으로 묶어 놓은 것을 말한다. 비슷한 의미로 사용할 변수가 너무 많을 때 배열을 사용할 수 있다. 예를 들어 학생들의 점수를 변수에 저장하려고 할 때 30개의 변수를 선언하는 것보다 크기가 30인 배열 하나를 선언하는 것이 간편하기 때문이다. 이때 1차원이라는 것은 변수들이 하나의 계층에 모여져 있는 것이라고 생각하면 쉽다. 배열의 선언 배열을 선언하는 데에는 자료형, 배열 이름, 배열 길이가 필요하다. 예를 들어 int형의 이름이 "arr"이고 길이가 5인 1차원배열은 다음과 같이 선언할 수 있다. #include int main() { int arr[5]; return 0; } 위 코드에서 만든 배열은 5개의 변수를 만든 것과 같다. 만들어진 배열에 접근하는 방.. [C언어] 지역변수, 전역변수 지역변수 지역변수는 정해진 영역에서만 사용 가능한 번수이다. 여기서 말하는 정해진 영역이란 중괄호에 의해 형성되는 영역을 의미한다. 예를 들어서 test라는 함수를 선언하고 그 안에서 변수를 하나 선언했다고 하자. 그러면 그 변수는 test 함수안에서만 사용 가능할 뿐 다른 함수에서는 사용이 불가능하다. #include void test (int num) { int tes = 4; printf("%d\n", tes*num); } int main () { test(10); printf("%d", tes*15); return 0; } 따라서 위 코드에서 tes 변수는 test 함수에서 선언된 변수이기 때문에 main 함수에서는 사용할 수가 없다. 그러나 test 함수에서 선언된 변수는 test 함수가 끝난 .. [C언어] 재귀함수 재귀함수 함수를 정의할 때 자기 자신을 호출하는 것도 가능하다. 완료되지 않은 함수를 다시 호출하는 것이 가능하기 때문이다. 완료되지 않은 함수(자기 자신)를 호출하면 그 함수의 복사본을 만들어서 그 복사본을 실행하게 되는 것이다. 예를 들어 'alpha'라는 재귀함수를 선언해보겠다. #include void alpha(int num) { if (num==1) return; printf("num = %d 입니다.\n", num); num--; alpha(num); } int main () { alpha(10); return 0; } 먼저 'alpha'는 10을 입력받았으므로 10을 출력할 것이다. 그다음으로 num 은 1 줄어들 것이고 'alpha'가 다시 호출되었으므로 복사본이 만들어지고 실행된다. n.. 이전 1 2 3 4 5 6 7 다음