C 언어
포인터는 하나의 값을 반환하도록 제한되는 'C' 함수에 큰 가능성을 제공합니다. 포인터 매개변수를 사용하면 이제 함수에서 데이터 복사본이 아닌 실제 데이터를 처리할 수 있습니다.
변수의 실제 값을 수정하기 위해 호출 문은 함수의 포인터 매개변수에 주소를 전달합니다.
여기에서 튜토리얼, 당신은 배울 것입니다-
예를 들어, 다음 프로그램은 두 값을 2로 교환합니다.
void swap (int *a, int *b); int main() { int m = 25; int n = 100; printf("m is %d, n is %d\n", m, n); swap(&m, &n); printf("m is %d, n is %d\n", m, n); return 0;} void swap (int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp;} }
출력:
m is 25, n is 100 m is 100, n is 25
함수가 포인터를 사용하여 주소로 액세스하기 때문에 프로그램은 실제 변수 값을 교환합니다. 여기에서 프로그램 프로세스에 대해 논의할 것입니다.
C에서는 값으로 배열을 함수에 전달할 수 없습니다. 반면에 배열 이름은 포인터(주소)이므로 배열에 대한 포인터를 전달한다는 의미인 함수에 배열 이름을 전달하면 됩니다.
예를 들어 다음 프로그램을 고려합니다.
int add_array (int *a, int num_elements); int main() { int Tab[5] = {100, 220, 37, 16, 98}; printf("Total summation is %d\n", add_array(Tab, 5)); return 0;} int add_array (int *p, int size) { int total = 0; int k; for (k = 0; k < size; k++) { total += p[k]; /* it is equivalent to total +=*p ;p++; */} return (total);}
출력:
Total summation is 471
여기에서 세부 정보와 함께 프로그램 코드를 설명합니다.
C에서는 다음 프로그램과 같이 배열에 대한 포인터를 반환할 수 있습니다.
#include <stdio.h> int * build_array(); int main() { int *a; a = build_array(); /* get first 5 even numbers */ for (k = 0; k < 5; k++) printf("%d\n", a[k]); return 0;} int * build_array() { static int Tab[5]={1,2,3,4,5}; return (Tab);}
출력:
1 2 3 4 5
여기에서 프로그램 세부 정보에 대해 논의할 것입니다.
배열이 아니라 포인터가 함수에 의해 반환된 배열 주소를 저장하도록 정의되어 있음을 주목하십시오. 또한 지역 변수가 함수에서 반환될 때 함수에서 정적 변수로 선언해야 합니다.
포인터가 모든 메모리 위치의 주소를 가리키는 정의에 의해 알고 있듯이, 포인터는 실행 코드의 시작 부분을 메모리의 함수로 가리킬 수도 있습니다.
함수에 대한 포인터는 다음의 일반 명령문인 *로 선언됩니다. 선언은 다음과 같습니다.
return_type (*function_name)(arguments)
(*function_name) 주위의 괄호가 중요하다는 것을 기억해야 합니다. 괄호가 없으면 컴파일러는 function_name이 return_type의 포인터를 반환한다고 생각하기 때문입니다.
함수 포인터를 정의한 후에는 이를 함수에 할당해야 합니다. 예를 들어, 다음 프로그램은 일반 함수를 선언하고, 함수 포인터를 정의하고, 일반 함수에 함수 포인터를 할당하고, 그 후에 포인터를 통해 함수를 호출합니다.
#include <stdio.h> void Hi_function (int times); /* function */ int main() { void (*function_ptr)(int); /* function pointer Declaration */ function_ptr = Hi_function; /* pointer assignment */ function_ptr (3); /* function call */ return 0;} void Hi_function (int times) { int k; for (k = 0; k < times; k++) printf("Hi\n");}
출력:
Hi Hi Hi
함수 이름은 첫 번째 요소를 가리키는 배열 이름과 같이 실행 가능한 코드의 시작 주소를 가리킵니다. 따라서 function_ptr =&Hi_function 및 (*funptr)(3)과 같은 명령어가 정확합니다.
참고:함수 할당 및 함수 호출 중에 주소 연산자 &와 간접 연산자 *를 삽입하는 것은 중요하지 않습니다.
함수 포인터 배열은 다음 프로그램에서와 같이 결정을 내리기 위해 스위치 또는 if 문 역할을 할 수 있습니다.
#include <stdio.h> int sum(int num1, int num2); int sub(int num1, int num2); int mult(int num1, int num2); int div(int num1, int num2); int main() { int x, y, choice, result; int (*ope[4])(int, int); ope[0] = sum; ope[1] = sub; ope[2] = mult; ope[3] = div; printf("Enter two integer numbers: "); scanf("%d%d", &x, &y); printf("Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: "); scanf("%d", &choice); result = ope[choice](x, y); printf("%d", result); return 0;} int sum(int x, int y) {return(x + y);} int sub(int x, int y) {return(x - y);} int mult(int x, int y) {return(x * y);} int div(int x, int y) {if (y != 0) return (x / y); else return 0;}
Enter two integer numbers: 13 48 Enter 0 to sum, 1 to subtract, 2 to multiply, or 3 to divide: 2 624
여기에서 프로그램 세부 정보에 대해 설명합니다.
명령어 int (*ope[4])(int, int); 함수 포인터의 배열을 정의합니다. 각 배열 요소는 동일한 매개변수와 반환 유형을 가져야 합니다.
문 결과 =ope[choice](x, y); 사용자의 선택에 따라 적절한 함수를 실행합니다. 입력된 두 정수는 함수에 전달되는 인수입니다.
void 포인터는 함수 선언 중에 사용됩니다. 우리는 void * 반환 유형을 사용하여 모든 유형을 반환할 수 있습니다. 함수에 전달할 때 매개변수가 변경되지 않는다고 가정하면 const로 선언합니다.
예:
void * cube (const void *);
다음 프로그램을 고려하십시오.
#include <stdio.h> void* cube (const void* num); int main() { int x, cube_int; x = 4; cube_int = cube (&x); printf("%d cubed is %d\n", x, cube_int); return 0;} void* cube (const void *num) { int result; result = (*(int *)num) * (*(int *)num) * (*(int *)num); return result;}
결과:
4 cubed is 64
여기에서 프로그램 세부 사항에 대해 논의할 것입니다.
함수 포인터를 "콜백 함수"라고 하는 다른 함수에 인수로 전달하여 함수 포인터를 악용하는 또 다른 방법은 수신 함수가 "다시 호출"하기 때문입니다.
stdlib.h 헤더 파일에서 Quicksort "qsort() ” 함수는 배열 정렬 전용 알고리즘인 이 기술을 사용합니다.
void qsort(void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
다음 프로그램은 qsort() 함수를 사용하여 정수 배열을 작은 수에서 큰 수로 정렬합니다.
#include <stdio.h> #include <stdlib.h> int compare (const void *, const void *); int main() { int arr[5] = {52, 14, 50, 48, 13}; int num, width, i; num = sizeof(arr)/sizeof(arr[0]); width = sizeof(arr[0]); qsort((void *)arr, num, width, compare); for (i = 0; i < 5; i++) printf("%d ", arr[ i ]); return 0;} int compare (const void *elem1, const void *elem2) { if ((*(int *)elem1) == (*(int *)elem2)) return 0; else if ((*(int *)elem1) < (*(int *)elem2)) return -1; else return 1;}
결과:
13 14 48 50 52
여기에서 프로그램 세부 사항에 대해 논의할 것입니다.
C 언어
C에서 Switch 문이란 무엇입니까? C의 switch 문 변수의 값을 테스트하고 여러 사례와 비교합니다. 대소문자 일치가 발견되면 해당 특정 사례와 관련된 명령문 블록이 실행됩니다. 스위치 블록의 각 케이스에는 식별자라고 하는 다른 이름/번호가 있습니다. 사용자가 제공한 값은 일치하는 항목을 찾을 때까지 switch 블록 내부의 모든 케이스와 비교됩니다. 대소문자가 일치하지 않으면 기본 문이 실행되고 제어가 스위치 블록을 벗어납니다. 이 튜토리얼에서는 배우게 될 것입니다- C에서 Switch 문이란 무엇입니까? 대소문
C에서 함수란 무엇입니까? C 프로그래밍의 기능 프로그램을 더 쉽게 이해하고 테스트하고 호출 프로그램을 변경하지 않고도 쉽게 수정할 수 있는 재사용 가능한 코드 블록입니다. 함수는 코드를 분할하고 프로그램을 모듈화하여 더 좋고 효과적인 결과를 제공합니다. 간단히 말해서 더 큰 프로그램은 함수라고 하는 다양한 하위 프로그램으로 나뉩니다. 큰 프로그램을 다양한 기능으로 나누면 각 기능을 개별적으로 관리하기 쉬워집니다. 프로그램에 오류가 발생할 때마다 쉽게 잘못된 기능을 조사하고 해당 오류만 수정할 수 있습니다. 필요할 때