산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

예제가 있는 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

함수가 포인터를 사용하여 주소로 액세스하기 때문에 프로그램은 실제 변수 값을 교환합니다. 여기에서 프로그램 프로세스에 대해 논의할 것입니다.

  1. 두 변수 값을 교환하는 함수를 선언합니다. 이 함수는 두 개의 정수 포인터를 매개변수로 사용하고 호출될 때 모든 값을 반환합니다.
  2. 메인 함수에서 두 개의 정수 변수('m' 및 'n')를 선언하고 초기화한 다음 각각의 값을 출력합니다.
  3. 앰퍼샌드 기호를 사용하여 두 변수의 주소를 인수로 전달하여 swap() 함수를 호출합니다. 그 후, 우리는 변수의 새로운 교환 값을 출력합니다.
  4. 여기서 두 개의 정수 변수 주소를 매개변수로 사용하는 swap() 함수 내용을 정의하고 두 번째 변수에 넣을 값 변수 중 하나를 저장하기 위해 세 번째 저장 상자로 사용되는 임시 정수 변수를 선언합니다.
  5. 'a'가 가리키는 첫 번째 변수의 내용을 임시 변수에 저장합니다.
  6. b가 가리키는 두 번째 변수를 a가 가리키는 첫 번째 변수에 저장합니다.
  7. 임시 변수에 저장된 첫 번째 변수의 값으로 두 번째 변수(b가 가리키는)를 업데이트합니다.

배열 매개변수가 있는 함수

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

여기에서 세부 정보와 함께 프로그램 코드를 설명합니다.

  1. 요소 번호와 함께 배열 주소(포인터)를 매개변수로 사용하고 이러한 요소의 총 누적 합계를 반환하는 add_array() 함수를 선언하고 정의합니다. 포인터는 p[k] 표기법을 사용하여 배열 요소를 반복하는 데 사용되며 전체 요소 배열을 반복한 후에 반환될 로컬 변수에 합계를 누적합니다.
  2. 5개의 정수 요소로 정수 배열을 선언하고 초기화합니다. 배열 이름(주소 역할)과 배열 크기를 add_array()에 전달하여 총 합계를 인쇄합니다. 함수를 인수로 호출했습니다.

배열을 반환하는 함수

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

여기에서 프로그램 세부 정보에 대해 논의할 것입니다.

  1. 인수를 사용하지 않고 정수 값을 포함하는 배열 주소를 반환하는 함수를 정의하고 선언합니다.
  2. 함수가 호출된 후 작성된 전체 배열을 수신하는 정수 포인터를 선언하고 전체 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

  1. 함수가 호출될 때 매개변수가 나타내는 k번 Hi 텍스트를 인쇄하는 표준 함수를 정의하고 선언합니다.
  2. 정수 매개변수를 사용하고 아무 것도 반환하지 않는 포인터 함수(특수 선언 포함)를 정의합니다.
  3. 포인터가 Hi_function()을 가리킴을 의미하는 Hi_function으로 포인터 함수를 초기화합니다.
  4. 함수 이름에 인수를 붙여서 호출하는 표준 함수가 아니라 숫자 3을 인수로 전달하여 포인터 함수만 호출하면 됩니다!

함수 이름은 첫 번째 요소를 가리키는 배열 이름과 같이 실행 가능한 코드의 시작 주소를 가리킵니다. 따라서 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

여기에서 프로그램 세부 정보에 대해 설명합니다.

  1. 우리는 두 개의 정수 인수를 취하고 정수 값을 반환하는 네 가지 함수를 선언하고 정의합니다. 이 함수는 사용자가 호출하는 함수에 대한 두 인수를 더하고, 빼고, 곱하고, 나눕니다.
  2. 피연산자, 연산 유형 및 결과를 각각 처리하기 위해 4개의 정수를 선언합니다. 또한 4개의 함수 포인터 배열을 선언합니다. 배열 요소의 각 함수 포인터는 두 개의 정수 매개변수를 취하고 정수 값을 반환합니다.
  3. 이미 선언된 함수로 각 배열 요소를 할당하고 초기화합니다. 예를 들어, 세 번째 함수 포인터인 세 번째 요소는 곱셈 연산 함수를 가리킵니다.
  4. 우리는 키보드로 입력한 사용자로부터 피연산자와 연산 유형을 찾습니다.
  5. 인수를 사용하여 적절한 배열 요소(함수 포인터)를 호출하고 적절한 함수에서 생성된 결과를 저장합니다.

명령어 int (*ope[4])(int, int); 함수 포인터의 배열을 정의합니다. 각 배열 요소는 동일한 매개변수와 반환 유형을 가져야 합니다.
문 결과 =ope[choice](x, y); 사용자의 선택에 따라 적절한 함수를 실행합니다. 입력된 두 정수는 함수에 전달되는 인수입니다.

void 포인터를 사용한 함수

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

여기에서 프로그램 세부 사항에 대해 논의할 것입니다.

  1. 정수 값을 반환하고 특정 데이터 유형 없이 변경 불가능한 변수의 주소를 취하는 함수를 정의하고 선언합니다. num 포인터가 가리키는 내용 변수(x)의 큐브 값을 계산하고 void 포인터이므로 특정 표기법(* 데이터 유형) 포인터를 사용하여 정수 데이터 유형으로 유형 캐스트해야 합니다. 큐브 값.
  2. 피연산자와 결과 변수를 선언합니다. 또한 피연산자를 값 "4"로 초기화합니다.
  3. 피연산자 주소를 전달하여 큐브 함수를 호출하고 결과 변수에서 반환 값을 처리합니다.

인수로서의 함수 포인터

함수 포인터를 "콜백 함수"라고 하는 다른 함수에 인수로 전달하여 함수 포인터를 악용하는 또 다른 방법은 수신 함수가 "다시 호출"하기 때문입니다.
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

여기에서 프로그램 세부 사항에 대해 논의할 것입니다.

  1. 두 개의 인수로 구성된 비교 함수를 정의하고 인수가 동일한 값을 가질 때 0을 반환하고, arg1이 arg2보다 앞에 올 때 <0, arg1이 arg2 뒤에 올 때>0을 반환합니다. 배열 데이터 유형(정수)
  2. 정수 배열을 정의하고 초기화합니다. 배열 크기는 num에 저장됩니다. 변수이고 각 배열 요소의 크기는 미리 정의된 sizeof() C 연산자를 사용하여 너비 변수에 저장됩니다.
  3. 우리는 qsort 라고 부릅니다. 함수를 입력하고 사용자가 이전에 정의한 배열 이름, 크기, 너비 및 비교 함수를 전달하여 배열을 오름차순으로 정렬합니다. 비교는 전체 배열이 정렬될 때까지 각 반복에서 두 개의 배열 요소를 취하여 수행됩니다.
  4. for 루프를 사용하여 전체 배열을 반복하여 배열이 잘 정렬되었는지 확인하기 위해 배열 요소를 인쇄합니다.

C 언어

  1. C 프로그래밍의 사용자 정의 함수 유형
  2. C++ do… while 루프 예제
  3. 예제가 있는 C++ 포인터
  4. 예제를 사용한 C++ 연산자 오버로딩
  5. 프로그램 예제가 있는 C++ 함수
  6. 예제가 있는 C# 컬렉션 자습서
  7. C의 포인터:C 프로그래밍의 포인터란 무엇입니까? 유형
  8. 예제가 있는 Python 문자열 count()
  9. 예제가 있는 Python Lambda 함수
  10. 예제가 있는 Python round() 함수