초보자 노트 - 함수 바늘의 간단한 응용
15184 단어 함수 포인터
data
1 int strcpy1(char *brr, char *crr)
2 {
3 int i=0;
4 while(*(crr+i))
5 {
6 *(brr+i) = *(crr+i);
7 i++;
8 }
9
10 *(brr+i) = '\0'; // *(crr+i)
11 }
12
13 int main()
14 {
15 int i;
16 char *arr = "hello!";
17 char data[1024] = {0};
18
19 int (*p)(char *, char *) = strcpy1;
20 p(data, arr);
21
22 printf("%s
", data);
23 }
출력 결과:hello!
원인: * (crr+i)가 읽기 전용 구역에 있기 때문에 세그먼트 오류가 발생합니다!
방법2:
1 #include <stdio.h>
2
3 char * strcpy1(char *brr, char *crr)
4 {
5 int i=0;
6 while(*(crr+i))
7 {
8 *(brr+i) = *(crr+i);
9 i++;
10 }
11
12 *(brr+i) = '\0'; // *(crr+i)
13 return brr;
14 }
15
16 int main()
17 {
18 int i;
19 char *arr = "hello!";
20 char data[1024] = {0};
21
22 char *(*p)(char *, char *) = strcpy1;
23 char *red = p(data, arr);
24
25 printf("%s
", red);
26 }
문자열을 거꾸로 설정하려면 다음과 같이 하십시오.
#include <stdio.h>
#include <string.h>
char *fox(char *dest, char *src)
{
int i, j;
for(i=strlen(src)-1, j=0;i>=0; i--,j++)//sizeof(src) ,src
{
*(dest+j) = *(src+i);
}
*(dest+j) = '\0';
return dest;
}
int main()
{
char *p = "hello!";
char data[1024] = {0};
char *(*fp)(char *, char *);
fp = fox;
char *red = fp(data, p);
printf("%s
", red);
}
주의: fox 함수에서sizeof()를 사용하면 바늘 src의 크기인 4바이트를 되돌려줍니다. src가 가리키는 문자열의 길이가 아닙니다.
콜백 함수 및 구조체 내 함수 포인터 사용:
1 #include <stdio.h>
2
3 struct person{
4 int (*p)(int, int);
5 };
6
7 int mtod(int m, int d)
8 {
9 static int month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
10 int days = 0;
11 int i, j;
12
13 if(m == 1)
14 return d;
15 else
16 {
17 for(i=0; i<=m-2; i++)
18 days = days + month[i];
19 return days+d;
20 }
21 }
22
23 int time(int (*p)(int, int), int i, int j)
24 {
25 p(i, j);
26 }
27
28 int main()
29 {
30 int i, j, k, l;
31 i = mtod(12,31);
32 printf("%d
", i);
33
34 int (*p)(int, int) = mtod;
35 j = p(1,1);
36 printf("%d
", j);
37
38 k = time(p, 2, 10);
39 printf("%d
", k);
40
41 struct person jim;
42 jim.p = mtod;
43 l = jim.p(12,30);
44 printf("%d
", l);
45 }
오늘의 주요 내용은 이것들뿐이어서 좀 빙빙 돌기 때문에 더욱 숙련되어야 한다.