본문 바로가기
반응형

프로그래밍 언어/C 언어39

[C] 로그(log) 함수 C / C++ 언어에서 비트연산이나 코딩 문제를 풀다보면 수학 관련 문제를 푸는 경우가 있다. C언어에서도 #include 로 밑이 다양한 로그함수를 제공한다. 함수 오버로딩(Overloading)이 안되기 때문에 매개변수 자료형에 따라 함수명을 결정해야 한다. 밑이 e 인 로그 함수 (자연 로그) - double log(double n); - float logf(float n); - long double logl(long double n); 밑이 10 인 로그 함수 (상용 로그) - double log10(double n); - float log10f(float n); - long double log10l(long double n); 밑이 2 인 로그 함수 - double log2(double n); .. 2021. 9. 1.
[C] 함수 포인터와 void 포인터 함수 포인터 변수 메모리상에 저장된 함수의 주소 값을 포인터 변수 변수뿐만 아니라 함수들도 바이너리 형태로 메모리 공간에 조장되어 호출 · 실행 배열의 이름과 마찬가지로 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미. 함수 이름의 포인터 형은 함수의 반환형과 매개변수의 선언을 통해서 결정짓도록 약속. int testFunc(int x){...} : 반환형(int) / 매개변수(int형 1개) ▷ int(*fptr)(int) = testFunc; void sampleFunc(int x, int y){...} : 반환형(void) / 매개변수(int형 2개) ▷ void(*fptr)(int, int) = sampleFunc; 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언 형태.. 2021. 3. 20.
[C] 포인터의 포인터(이중 포인터) 포인터의 포인터(이중 포인터) int ** dptr; // int형 이중 포인터 포인터 변수는 종류에 상관없이 무조건 주소 값을 저장하는 변수 이중 포인터 변수는 포인터 변수를 가리키는 대상에서 차이가 있습니다. double num = 3.14; double *ptr = # double **dptr = &ptr; double *ptr2 = *dptr; ptr과 ptr2와 동일한 대상을 가리키게 되었습니다. 잘못된 swap 예제 #include void swap(int* x, int* y) { int* temp = x; x = y; y = temp; } int main(void) { int a = 10, b = 20; int* p1, *p2; p1 = &a, p2 = &b; printf("%d %d.. 2021. 3. 20.
[C] 포인터 변수와 const 키워드 포인터 변수와 const 키워드 아래 두 구문은 차이가 존재합니다. ① const int *ptr = # ② int * const ptr = # [첫번째]는 포인터 변수 ptr이 가리키는 변수에 저장된 값 변경을 허용하지 않는 것입니다. 하지만 변수 num 자체는 상수가 아니기 때문에 변경이 가능합니다. 즉, const 선언은 값 변경에 제한을 두지만 상수화 하는 것은 아닙니다. int num = 20; const int *ptr = # *ptr = 30; // 포인터 변수를 이용한 실제 값 변경 시도시 컴파일 에러 num = 40; // num 자체가 상수는 아니기 때문에 변경 가능 [두번째]의 경우는 포인터 변수를 상수화 시키는 경우로, 한번 주소 값이 저장되면 그 주소값 변경이.. 2021. 3. 20.
[C] 포인터 변수 개념 포인터 포인터 변수란 메모리의 주소 값을 저장하기 위한 변수 #include #include int main(void) { int num = 7; int* p; // 포인터 변수 선언 p = # // num의 주소값을 포인터 변수 p에 저장 printf("%d", *p); // 포인터 p가 가리키고 있는 실제값 출력 } 포인터 변수 p이 int형 변수 num을 가리킨다. 포인터 변수는 double *p;와 unsigned int *p; 같이 선언 포인터 형(type)은 메모리 공간을 참조하는 기준이 됩니다. - int (4 byte), double (8 byte) #include #include int main(void) { double num = 3.14; // double 형 변수 int* p.. 2021. 3. 20.
[C] 다차원 배열과 포인터 관계 다차원 배열과 포인터 관계 1, 2차원 배열 모두 크기를 알려주지 않고 초기화가 가능 int arr[] = {1, 2, 3}; // 크기: 3 int arr[][4] = {1, 2, 3, 4, 5, 6, 7, 8}; // 크기: 3 × 4 int arr[][2] = {1, 2, 3, 4, 5, 6, 7, 8}; // 크기: 6 × 2 int arr[][] = {} // 정확히 어떤 크기를 가져야 할지 알 수 없기에 컴파일 에러 int arr[2][] = {1, 2, 3, 4}; // {1, 2, 3} + {4} 크기를 어떻게 잡을지 알 수 없으므로 컴파일 에러 배열이름 기반의 포인터 연산: 배열 이름에 1을 더한 결과는? #include int main(void){ int arr1[3][2], arr2[.. 2021. 3. 20.
[C] Call-by-value & Call-by-reference 함수의 인자 전달 인자 전달의 기본 방식은 값의 복사(Call-by-value) 입니다. 값의 복사는 원본의 값이 함수 전/후로 변경되지 않습니다. 배열 원소도 마찬가지인데, 배열 원소 전부를 전달하는 방법은 없습니다. 대신, 주소값 전달(Call-by-reference)합니다. 그리고 주소값을 전달하는 경우에는 원본의 값이 전/후로 변경이 됩니다. #include // 함수내에서 param의 크기는 배열의 크기가 아닌 포인터의 크기를 의미 // 따라서 배열의 크기를 별도 함수의 인자로 같이 전달받습니다. void testFunc(int * param, int len) { for (int i = 0; i < len; i++) { param[i] *= 10; } } int main(void) { int a.. 2021. 3. 20.
[C] 포인터와 배열의 관계 포인터와 배열의 관계 배열의 이름도 포인터 (배열의 첫번째 요소부터 가르키고 있음) (단, 그 값을 바꿀 수 없는 상수 형태의 포인터라고 합니다.) #include int main(void) { int arr[3] = { 0, 1, 2 }; printf("배열의 이름: %p \n", arr); for (int i = 0; i < 3; i++) { printf("%d 번째 요소: %p \n", i, &arr[i]); } } ※ 배열 요소가 메모리 공간에 연속적으로 할당되는 것을 확인할 수 있음 arr[i] == *(arr + i) #include int main(void) { int arr[3] = { 0, 1, 2 }; int* ptr = &arr[0]; // int* ptr = arr;과 동일 for .. 2021. 3. 20.
[C] 동적 할당 필요성 동적 할당 필요성 동적 할당은 할당되는 메모리의 크기를 컴파일러가 결정하지 않고 프로그램 실행 중간에 호출되는 malloc 함수가 결정 ※ 메모리를 동적으로 할당하는 키워드로는 malloc, calloc 등이 존재합니다. malloc 함수 사용 형태 인자로 전달된 정수 값에 해당하는 바이트 크기의 메모리 공간을 힙 영역에 할당하고 이 메모리 공간의 주소 값을 반환 (실패할 경우 NULL 반환) int *ptr = (int *)malloc(sizeof(int)); double *ptr = (double *)malloc(sizeof(double)); 일반 변수에서 값에 의한 복사를 이용하는 경우에는 큰 문제는 없습니다. #define _CRT_SECURE_NO_WARNINGS #include char* re.. 2021. 3. 20.
[C] [전처리기] #ifdef #ifdef 사용되는 형태는 아래와 같다. #ifdef {NAME} ... #else ... #endif {NAME} 선언 여부에 따라 컴파일 되는 부분이 달라진다. #define에서 선언여부와 관계 있지 정의 여부와는 관계가 없다. #define TEST #define TEST 3 Q) 이러한 전처리기 언제 사용할까? 인터넷에서 파일을 다운받는 프로그램을 만든다고 했을 때, 다운받는 최대 속도(MAX_SPEED)를 배포 유형에 따라 설정할 수 있다. - 무료 버전 최대 속도 10 / 유료 버전 최대 속도 100 #ifdef __FREE__ #define MAX_SPEED 10 #else #define MAX_SPEED 100 #endif int speed; int main() { // 최고 속도이하로 .. 2021. 3. 20.
반응형