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);
}