c 언어 에서 의 리 셋 함수 에 대한 이해

머리말
컴퓨터 프로 그래 밍 에서 리 셋 함수 또는 리 셋 이 라 고 부 르 는 것 은 함수 매개 변 수 를 통 해 다른 코드 에 전달 되 는 실행 가능 한 코드 의 인용 을 말한다.이 디자인 은 고 층 에서 정 의 된 서브루틴 을 바 텀 코드 로 호출 할 수 있 도록 해 주 었 다.
이 말 은 그다지 이해 하기 쉽 지 않 아서,서로 다른 언어 가 회 조 를 실현 하 는 방식 이 약간 다르다.사실은 이렇게 이해 할 수 있다.리 셋 은 한 함수 에서 다른 함 수 를 호출 하 는 것 이다.

c 언어 에서 리 셋 은 함수 포인터 로 이 루어 집 니 다.함수 지침―말 그대로 함 수 를 가리 키 는 지침 이다.보통 함수 지침 은 두 가지 용도 가 있 는데 하 나 는 변환 표(jump table)이 고 다른 하 나 는 매개 변수 로 함수 에 전달 된다.
다음은 두 함수 포인터 의 성명 입 니 다.

int(*f)(int,float);int*(*g[])(int,float);
전 자 는 f 를 함수 포인터 로 설명 하고 함수 가 가리 키 는 두 개의 매개 변 수 를 받 아들 이 며 각각 하나의 정형 값 과 부동 소수점 값 이 며 하나의 정형 값 을 되 돌려 줍 니 다.
후 자 는 g 를 하나의 배열 로 설명 하고 배열 의 요소 유형 은 함수 포인터 입 니 다.그 가 가리 키 는 함 수 는 두 개의 매개 변 수 를 받 아들 이 고 각각 하나의 정형 값 과 부동 소수점 값 이 며 하나의 정형 지침 을 되 돌려 줍 니 다.

주의해 야 할 것 은 함수 지침 을 간단하게 설명 하 는 것 이 곧 사용 할 수 있다 는 것 을 의미 하지 않 는 다 는 것 이다.다른 포인터 와 마찬가지 로 함수 포인터 에 간접 접근 을 하기 전에 특정한 함 수 를 가리 키 는 것 으로 초기 화 해 야 합 니 다.아래 코드 세그먼트 는 함수 지침 을 초기 화 하 는 방법 을 설명 합 니 다.

intf(int);int(*pf)(int) = f;
두 번 째 성명 은 함수 포인터 pf 를 만 들 고 지향 함수 f 로 초기 화 합 니 다.함수 포인터 의 초기 화 도 하나의 할당 문 구 를 통 해 이 루어 질 수 있 습 니 다.함수 포인터 가 초기 화 되 기 전에 f 의 원형 을 가 지 는 것 이 중요 합 니 다.그렇지 않 으 면 컴 파일 러 는 f 의 유형 이 pf 가 가리 키 는 유형 과 일치 하 는 지 확인 할 수 없습니다.
하나의 예 를 통 해 리 셋 함수 의 사용 을 간단하게 소개 하 다.
모두 c 언어의 라 이브 러 리 함수 qsort 에 대해 알 아야 합 니 다.qsort 성명 은 다음 과 같 습 니 다.

void qsort(void*base,size_tnitems,size_tsize,int(*compar)(constvoid*,constvoid*))
이 를 통 해 알 수 있 듯 이 세 번 째 매개 변 수 는 함수 포인터 입 니 다.포인터 가 가리 키 는 유형 을 정의 하지 않 은 두 개의 매개 변수 a,b 를 입력 하여 전체 값 을 되 돌려 줍 니 다.실제로 이곳 에 서 는 리 턴 함 수 를 사용 하 였 다.리 셋 함 수 를 통 해 qsort 는 실행 할 때 사용자 가 정의 하 는 함 수 를 호출 할 수 있 습 니 다.
여기 서 우 리 는 간단 한 sort 함 수 를 설계 하여 리 셋 과정 을 이해한다.
1.정의 함수 포인터

typedefint(*compar)(constint*a,constint*b);
2.sort 함 수 를 사용자 정의 합 니 다.간단 하기 위해 거품 정렬 을 사용 합 니 다.

int*sort(int*nums,intn, compar cmp){int*target =malloc(n*sizeof(int));if(!target) perror("Memory error");memcpy(target, num, n *sizeof(int));for(inti =0; i < n; i++) {for(intj = i+1; j < n; j++) {if(cmp(target[i], target[j]) >0) {target[i] ^= target[j] ^= target[i] ^= target[j];}}}returntarget;}
3.함수 리 셋 실현

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<errno.h>typedefint(*compar)(constint*a,constint*b);//          "    "int*sort(int*nums,intn, compar cmp){int*target =malloc(n*sizeof(int));if(!target) perror("Memory error");memcpy(target, num, n *sizeof(int));for(inti =0; i < n; i++) {for(intj = i+1; j < n; j++) {if(cmp(target[i], target[j]) <=0) {target[i] ^= target[j] ^= target[i] ^= target[j];}}}returntarget;}

//       intcmp1(inta,intb){returna < b;}intmain(intargc,charconst*argv[]){inta[10] = {1,4,3,1,10,4,5};int*x = bubble_sort(a,7, cmp1);for(inti =0; i <7; i++)printf("%d ", x[i]);printf("
");return0;}
실행 결과:
1
1 1 3 4 4 5 10
호출 함 수 는 함수 에 int(*compar)(const int*a,const int*b)를 전달 합 니 다.이것 은 int cmp 1(int a,int b)함수 의 입구 주소 입 니 다.즉,PC 지침 은 이 주소 로 이동 하여 int cmp 1(int a,int b)함 수 를 실행 할 수 있 으 며,유사 배열 을 통 해 이해 할 수 있 습 니 다.
함수 호출 을 실현 하 는 과정 에서 함수 가'호출 함수'를 호출 한 다음 에 그 중에서'호출 함수'를 추가 로 호출 합 니 다.주 함수 가'변조 함수'를 직접 호출 하 는 것 보다 개발 자가 아 닌 사용자 에 게 유연 한 인 터 페 이 스 를 제공 합 니 다.또한 함수 입 구 는 변수 처럼 설정 하여 개발 자 에 게 유연성 을 제공 할 수 있 습 니 다.
총결산
c 언어 에서 리 셋 함수 이해 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 c 언어 에서 리 셋 함수 이해 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기