c语言指针函数和函数指针
1.什么是函数
对比java的方法,一致。
2.函数返回类型
可以是任意类型,函数指针。
3.指针函数
指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
int fun(int x,int y);
————————返回值,int
int *fun(int x,int y);
————————指针函数,返回的是一个int*的指针,是一个地址,本质是函数
#include <stdio.h>
#include <stdlib.h>
int *changeData(int *x);
int addNum(int x, int y);
int main(int argc, char const *argv[])
{
int x = 2;
int *c = changeData(&x);
printf("%d\n", *c);
int d = addNum(2, 3);
printf("%d\n", d);
system("pause");
return 0;
}
int *changeData(int *x)
{
int c = 10;
x = &c;
return x; //值传递,将地址传递过去
}
int addNum(int x, int y)
{
int c = x + y;
return c; //值传递
}
4.函数指针
函数指针是指向函数的指针变量。
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
定义
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
声明格式:类型说明符 (*函数名) (参数)
——————简单说:函数指针,前提首先是指针,占用4字节或8字节,指针指向函数。
int (*fun)(int x,int y); //int x,int y为函数参数
函数指针:是将函数的地址赋值给它
fun = &Function;
fun = Function;
——————二者,在c/c++语言中,&针对函数是没有必要的,函数默认会传递地址,函数标志就代表它的地址。
执行:
x = (*fun)();
x = fun();
#include <stdio.h>
#include <stdlib.h>
int add(int x, int y);
int sub(int x, int y);
int (*fun)(int x, int y);
int main(int argc, char const *argv[])
{
fun = &add; //直接add也可以
printf("%d\n", fun(1, 3));
printf("%d\n", (*fun)(1, 3));
system("pause");
return 0;
}
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}
5.常见错误问题
#include <stdio.h>
#include <stdlib.h>
int *changeData(int *x);
int *addNum(int x, int y);
int main(int argc, char const *argv[])
{
int x = 2;
int *c = changeData(&x);
printf("%d\n", *c);
int *d = addNum(2, 3);
printf("%p\n", d);//获取的地址指向NULL
printf("%d\n", *d);//报错,获取不到值
system("pause");
return 0;
}
int *changeData(int *x)
{
int c = 10;
x = &c;
return x;
}
int *addNum(int x, int y)
{
int c = x + y;
printf("%d\n", c);
printf("%p\n", &c);
return &c; //在c/c++中,除了内存空间数值可以作为返回值传递,局部变量,地址是不能做欸返回值,因为局部变量在指向完函数之后,就会被删除,从内存空间以及地址都会被删除
}
——————注意:在c/c++中,除了内存空间数值可以作为返回值传递,局部变量/地址是不能做为返回值,因为局部变量在指向完函数之后,就会被删除,内存空间数值,需要看是否有指向,有,则存在,在C++中,编译器做了调整,可以使用一次。
简单说,局部变量地址先删除,局部变量内存空间数值看是否有指向的。
6.malloc 和realloc手动开辟内存
上面说了,局部变量,在函数执行完之后,会被销毁,但是这是自动的, 如果我们手动申请一片内存malloc,则不会被自动销毁,所有指向它的指针都不会被销毁,只有执行了free手动销毁,这块内存才能被销毁。
比如下面拼接字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *changeBubble2(char *arr1, char *arr2);
int main(int argc, char const *argv[])
{
char *arr1 = "abc";
char *arr2 = "def";
char *result = changeBubble2(arr1, arr2);
printf("%s\n", result);
free(result);//清空内存
result = NULL;
system("pause");
return 0;
}
char *changeBubble2(char *arr1, char *arr2)
{
char *result = (char *)malloc(strlen(arr1) + strlen(arr2) + 1); //1作为结束位置'\0',默认会添加'\0'
if (result == NULL)
{
exit(1);
}
char *temp = result; //记录首地址
while (*arr1 != '\0')
{
*result = *arr1;
arr1++;
result++;
}
while (*arr2 != '\0')
{
*result = *arr2;
arr2++;
result++;
}
printf("%c\n", *result);
return temp;
}
malloc:手动申请一片内存空间,但是不可以被机器销毁,只能手动
free:手动销毁内存。
重点:在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。
在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配