重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
成都创新互联专注于大洼网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供大洼营销型网站建设,大洼网站制作、大洼网页设计、大洼网站官网定制、微信平台小程序开发服务,打造大洼网络公司原创品牌,更为您提供大洼网站排名全网营销落地服务。
void ToUpper(char *p);
int main(void)
{
char s[10];
printf("Please input a string:\n");
scanf("%s",s);//数组名就是数组地址,不用加取址符
ToUpper(s);//自定义函数,在主函数中被调用时,不用加类型
printf("The new string is %s\n",s);
return 0;
}
void ToUpper(char *p)
{
for(;*p!='\0';p++)//这里的 *p=0删掉,*p=0等价于*p=NULL;也就是说你把指针p变成空指针了,没有指向了
{
if(*p='a'*p='z')//这里少个指针符
*p=*p-'a'+'A';
}
}
1楼感觉对函数指针不是很了解,就不评论了. 2楼的基本还可以,但是int (*p)(),然后让它指向max函数,一个包含两个未知量的函数,这在后来的标准c里面是不支持的好像. 3楼吧,那么多*,感觉有点不大对. *是取内容,连着那么* ,我没试过,没有多少意义至少.他11级了,应该也不会怎么有错,你可以试试(我不打算加那么多*, 就不调试了).
程序里面对函数的调用,就是通过函数的入口地址,然转入函数. 这样的话,函数指针的意义就明显了.函数指针指向了函数的入口,即函数指针里是函数的入口地址. 指针不能指向函数这种说法肯定是不对的.话说回来,1楼的老兄可能看错书了,或者记错了.
类型匹配很重要,二楼的声明和使用不一致,这在老版的编译器里也是支持的.那时候ANSI标准还没有制定出来.现在而言,这种定义应该不被支持了才是.
那个声明应该如下:
int (*p)(int , int);
这样才能指向
int name(int,int)型的函数.么有实验过,但按这种写法是不错的肯定.
三楼那个********p,怎么都觉得不对.
我不清楚你的疑问到底指哪些。我就你写的这些代码解读:
int read_column_numbers(int columns[], int max)函数功能:
传参数组首地址,及数组最大长度。
用户输入max个整数,只保存其中的正整数(负数忽略),如果正整数的个数是偶数则返回个数。否则程序结束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函数功能:
传参 数组output首地址 , 数组input首地址 ,用户输入正整数个数,正整数数组
迭代数组,根据用户的输入的数字作为input起始下标,复制并拼接到数组output中(具体逻辑我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)这里就是就是拼接复制,变量output_col记录的是output 已保存字符长度,output + output_col就是每次接在已有字符后面放复制的字符。input + columns[col]是用户输入的数字作为起始位置的偏移量取nchars个字符复制到output 中。
总结:
一、
首先数组名作为参数传递,无论形参定义是指针还是数组(int *columns 和 int columns[ ]效果是一样的),最终都是传地址。
二、
数组形参定义char const *,修饰符const表示常量不可修改,这里const修饰的是*input,表示数组指针指向的地址内容不能修改,但是数组指针本身值可以修改。也就是说函数中可以改变input指向的地址(比如input++),但是不能改变其指向的值(比如input[0]='A')。
void CallMyFun(FunType fp,int x);是一个包含函数指针的函数!
fp只是函数指针的名称,是 CallMyFun函数的形参,这个名称你可以随便取的
当调用CallMyFun(MyFun1,10);//假设调用此变量时,
fp指代的就是MyFun1函数,而MyFun1的参数哪里来?就是通过CallMyFun的第2个参数传递进来的,这里是10
所以运行CallMyFun(MyFun1,10);函数,其实就是运行了call MyFun1(10)
所以运行CallMyFun(MyFun2,20);函数,其实就是运行了call MyFun2(20)
所以fp(x)指代的是一个函数,如果要输出他的结果,那在定义MyFun1,MyFun2时,函数就需要有返回值,而不能用void
#include stdio.h
#include stdlib.h
int ave(int n,int *a);
int main()
{
int i,n,*a;
printf("please input number n:");
scanf("%d",n);
a=(int *) malloc(n*sizeof(int));
printf("please input %d numbers:\n",n);
for(i=0;in;i++)
scanf("%d",a+i);
printf("The average number is %d\n",ave(n,a));
}
int ave(int n,int *a)
{
int i,sum=0;
for(i=0;in;i++)
sum+=*(a+i);
return sum/n;
}
第一条红线是定义一个函数指针;
第二条红线起强转作用,把0xd010f0强转为对应的函数指针类型
我写的这个程序可以帮你理解...常量地址被printab取代~