第4次c练习

1、 读程序,写出你的分析步骤,得出结果。

typedef int (*FUNC1)(int);
typedef int (*FUNC2)(int *, int *, int *);
int inc(int a)
{
    return (++a);
}
int multi(int *a, int *b, int *c)
{
    return (*c=*a**b);
}
void show(FUNC2 fun, int arg1, int *arg2)
{
    FUNC1 p = inc;
    int temp = p(arg1);
    fun(&temp, &arg1, arg2);
    printf("%d\n", *arg2);
}
主程序:int a = 0; show(multi, 10, &a);

分析:
先看主函数,定义了一个int类型变量a,调用了show( )函数,
下来看show()函数,有三个参数,第一个参数是FUNC2类型的变量,实参传过去的时multi()函数,第二个是参数是一个int类型的变量,实参传过去的是整形数据10,第三个是一个int类型的地址,实参传过去的是a的地址,这表示可以通过指针修改a的值,
show()函数中,定义了一个FUNC1类型的变量p,并将inc()函数的首地址赋值给p,然后调用inc()函数,传入arg1的值10,返回值为11赋值给temp,
形参fun指向实参multi函数,fun()函数实际调用的是multi函数,传过去的实参是temp的地址,arg1的地址,a的地址arg2
multi函数将temp的地址指向的值11与arg1的地址指向的值10相乘,得出的值110赋值给arg2指向的空间,这里arg2指向变量a,也就是改变了a的值。
然后输出arg2指向的空间,也就是输出a的值110。

我觉得应该定义一个返回值为void的函数

typedef void (*FUNC2)(int , int , int *);

void multi(int a, int b, int *c)
{
  *c=a*b;
}
fun(temp, arg1, arg2);

这样应该能更好一点把,因为不需要修改temp和arg1的值,或者定义两个参数,将结果作为返回值赋值给*arg2

前两行自定义了两个数据类型,我的理解是这两个数据类型表示的是这一类函数的接口,用这两个数据类型定义的变量可以表示 参数和返回值类型相同 的函数名称,函数名称是函数首地址,用来连接具有这样的返回值和参数的函数体,

2、阅读一下程序,找出错误并更改。PS:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

<所有头文件都已包含>
main()
{
char*src="hello,world";
char* dest=NULL;
int len=sizeof(src);
dest=(char*)malloc(len);    
char* s=src[len];         
while(len--!=0)
dest++=s--;        
printf("%s",dest);
return 0;
}
main()
{
    char *src = "hello,world";
    char *dest = NULL;
    int len = strlen(src);
    dest = (char *)malloc(len + 1);
    if(len > 0){
        char *p=dest;
        char *s=src+len-1;
        while(len--)
            *(p++) = *(s--);
    }
    *p = '\0';
    printf("%s\n",dest);
    free(dest);
    return 0;
}

3、编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg”

//pStr是指向以”结尾的字符串的指针
//steps是要求移动的n

void LoopMove ( char * pStr, int steps )
{
    char* dest=NULL;
    int len=strlen(pStr);
    int secSteps = 0;
    char* s = pStr + len - steps;
    char *newStr = (char*)malloc(len + 1);\
    dest = newStr;
    if(steps > len)
        steps -= len;
    secSteps = len - steps;

    while(steps--)
        *(dest++) = *(s++);

    while(secSteps--)
        *(dest++) = *(pStr++);

    *dest = '\0';
    printf("%s\n", newStr);

    free(newStr);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值