본문 바로가기

728x90
반응형

전체 글

(157)
[C언어] 함수 포인터 배열 함수 포인터 배열 함수 포인터를 응용하여 함수를 배열에 넣어서 사용할 수 있다. 함수 포인터 배열은 함수 포인터를 선언할 때 함수 포인터 이름 뒤에 괄호와 배열의 크기를 넣어서 선언한다. 아래 코드처럼 int (*fptr[3])(int, int) = {FuncA, FuncB, FuncC}; 함수 포인터를 함수의 매개변수로 사용 함수 포인터를 함수의 매개변수로 사용할 수도 있다. #include #pragma warning(disable:4996) double add(int a, int b) { return (double)a + b; } double sub(int a, int b) { return (double)a - b; } double mul(int a, int b) { return (double)a ..
[C언어] 함수 포인터 함수와 주소 함수의 이름도 배열과 마찬가지로 주소를 나타낸다. 아래 코드를 통해서 확인이 가능하다. #include void helloworld() { printf("Hello, World!"); } int main() { printf("%p", helloworld); return 0; } 함수 포인터 함수 포인터에는 함수의 주소값을 저장할 수 있다. 함수 포인터를 선언할 때에는 저장될 함수의 반환형과 매개변수가 필요하다. 예를 들어 int형 변수 2개를 매개변수로 갖는 double형 함수의 주소를 저장하는 함수 포인터는 다음과 같인 선언할 수 있다. double (*ptr)(int, int) = calc; double calc (int a, int b) { return (double)a/b; } 매개변..
[C언어] 리터럴 상수 (Literal Constant) 리터럴 상수 (Literal Constant) 리터럴 상수란 자료형만 정해져있고 이름 없이 메모리에 저장된 데이터를 뜻한다. 다음 코드를 예시로 설명해 보겠다. int num = 50 + 20; 위 코드는 50과 20의 덧셈을 먼저 진행한 후에 그 결과 값을 num에 대입하게 된다. 그렇다면 50과 20도 CPU에서 계산되기 위해 메모리상에 존재하는 값이어야 할 것이다. 따라서 위 코드는 다음과 같은 형태가 된다. 이때 50과 20을 이름이 없는 상수, 즉 리터럴 상수라고 부른다. 이전에 문자열을 다루던 포스팅에서도 문자열을 설명할 때 여러 번 말했던 개념이기도 하다. 상수 형태의 문자열을 선언할 경우에 선언한 문자열도 마찬가지로 '리터럴 상수'가 되는 것이다.
[C언어] 문자열 배열 문자열 배열 문자열도 배열에 저장하는 것이 가능하다. 변수 형태의 문자열은 다차원 배열을 사용하면 되고 상수 형태의 문자열은 포인터 배열을 사용하면 된다. #include int main() { char name1[3][20] = {"ENCHUPIN1", "Enchupin1", "enchupin1"}; char *name2[3] = {"ENCHUPIN3", "Enchupin3", "enchupin3"}; printf("%s %s %s\n", name1[0], name1[1], name1[2]); printf("%s %s %s\n", name2[0], name2[1], name2[2]); return 0; } 위 코드를 실행시켜 보면 각각 3개의 문자열이 정상적으로 출력되는 것을 확인할 수 있다. 변수 형..
[C언어] 문자열 (변수 형태의 문자열, 상수 형태의 문자열) 변수 형태의 문자열 char형의 배열에 문자를 집어넣음으로써 문자열을 저장할 수 있다. 문자열을 입출력할 때 반복문을 사용하여 다음과 같이 코드를 작성할 수도 있다. #include #pragma warning(disable:4996) int main(void) { int i; char arr[5]; for(i=0;i
[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..

728x90
반응형