还是C

1.数组和指针参数
为什么c语言中的数组参数退化为指针?
因为c语言的数组不可改变,但是c指针可以改变。
例如:
int num[10], *p;
p = num;//此时p指向数组的第一个元素
我在主函数里调用两个函数
1  Sum(num);
2  Sum(p+2,10);
在这里面。第一Sum(num)指向的是数组名。不可改变,但是第二个函数Sum(p+2,10)
这个就指向第三个元素。由此可见,把参数改成指针的目的在于可以可改变参数。
2.函数的指针分析
函数一般的组成部分:返回值,参数类型,参数个数;类型的重
C语言可以通过typedef为函数重命名。
函数指针用于指向一个函数,函数名是执行函数体的热口地址。
type (*pointer)(parameter list))
 pointer 为函数指针变量名,
 type 为指向函数的返回值类型。
 parameter list为指向函数的参数列表


#include <stdio.h>


typedef int(FUNC)(int);


int test(int i)
{
    return i * i;
}


void f()
{
    printf("Call f()...\n");
}


int main()
{
    FUNC* pt = test;
    
    void(*pf)() = &f;
    
    pf();
    (*pf)();
    
    printf("Function pointer call: %d\n", pt(2));
}


分析;typedef int(FUNC)(int);函数的重命名。
test函数的定义和函数体;
f函数的定义和函数体。
FUNC类型的指针指向test函数。空类型指针指向f函数
调用,f()函数,再次调用;
综合上述所写可以看出指针可以指向函数,可以通过调用指针来调用函数;


回调函数:利用指针回调的一种机子。
回调原理:调用者不知道具体时间发生的时候需要调用具体的函数
当具体的事件发生时才可以调用具体的函数,调用者今儿回调函数的分开,两者互不依赖
#include <stdio.h>


typedef int(*FUNCTION)(int);


int g(int n, FUNCTION f)
{
    int i = 0;
    int ret = 0;
    
    for(i=1; i<=n; i++)
    {
        ret += i*f(i);
    }
    
    return ret;
}


int f1(int x)
{
    return x + 1;
}


int f2(int x)
{
    return 2*x - 1;
}


int f3(int x)
{
    return -x;
}


int main()
{
    printf("x * f1(x): %d\n", g(3, f1));
    printf("x * f2(x): %d\n", g(3, f2));
    printf("x * f3(x): %d\n", g(3, f3));
}
解析:typedef (*FUNCTION)(int)
变量的重新命名;  ret += i*f(i);函数的重新调用。
int g(int n, FUNCTION f)
{
    int i = 0;
    int ret = 0;
    
    for(i=1; i<=n; i++)
    {
        ret += i*f(i);
    }
    
    return ret;
}
int g(int n,FUNCTION f)
FUNCTION的变量指向函数f。
再次提点指针阅读的技巧:
从最里面的圆括号中未定义的标示符看起,从又向左看,当看到圆括号或者方括号时确定确定数据类型在回调




#include <stdio.h>


int main()

    int (*p2)(int*, int (*f)(int*));
    
    int (*p3[5])(int*);
    
    int (*(*p4)[5])(int*);
    
    int (*(*p5)(int*))[5];
}


解析:int (*p2)(int*, int (*f)(int*));首先是:int *
整形指针作为参数。然后是函数名,这个函数式指针类型,在然后是这个函数的指针类型
是int类型的,作为一个参数,惨然后是int类型的指针作为另一个参数,
在然后是指针类型的函数名为p2的int的类型的函数;
4.关于动态内存的分配:
void *calloc(size_t num,size_t size)
void *realloc(void *pointer,size_t new_size)
calloc 的参数代表的所返回的内存的类型信息。
calloc 会叫返回的内存初始化为0;
realloc 用于修改一个原先已经分配好的内存块大小,
在使用relloc之后应该使用其返回值
当pointer的第一个参数为null时,当家于malloc;


malloc返回值时什么?
1. 理念:0大小的对象也是对象。
2. 实践:返回空会和分配失败混淆,尤其是大小是计算出来的时候,这时如果得到的是空指针,用户程序会误以为分配失败了。
3. 实现:反正返回的地址不能读写,此时可以返回同一个固定的地址,并没什么额外开销。而且多数编译器,C和C++一起提供,C++库的new也用C库的malloc实现,使二者保持一致也比较省事。
4.不管返回的是不是空,都可以free的。


故此运行的结果是返回一个地址;


关于栈,堆,和静态存储器,三分天下,再次不在赘述
5.数组的递归和函数的设计技巧;
递归就是自己调用自己;
例如求解!n
#include<stdio.h>
int func(int x)
{
if(x>1)
return x*func(x-1);
else
return 1;


}


int main()
{
printf("!x=%d",func(4));
return 0;
}




















 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值