04C语言基础-指针函数

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函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值