关于函数指针和字符串指针区别?
函数指针
指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
类型说明符 (*函数名)(参数)
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
例如:
void (*fptr)();
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr=&Function;
fptr=Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
x=(*fptr)();
x=fptr();
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。
printf("%s",p); 需要打印的是一个字符串(%S),那么传给他的参数必须是一个字符串,那具体什么是字符串,顾名思义字符串肯定是一串字符,他的长度是不确定的,基本类型是无法直接表示一个字符串,我们通常都是用char数组来存放一个字符串,或者申请一定长度的内存来存放,并用指针来存放他的首地址,那么我们就知道在上述两种情况中字符串都是由他的首地址来表示,当然我们不要忘了一个字符串必须是\0为结束符。
现在我们回到上面这个问题,传给printf的参数必须是一个字符串的首地址,p
里面存放的正是字符串的首地址,*p表示的是首地址的内容,肯定错误。