本文目录一览:
C语言指针函数?
如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:
int(*p)(int, int);
这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
所以函数指针的定义方式为:
函数返回值类型 (* 指针变量名) (函数参数列表);
“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。
我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(*指针变量名)”。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“*”,如果有“*”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。
关于C语言指针和函数的问题(追加分)
这么给你解释吧,指针就相当是一个门牌号。第一个呢,是因为f()函数的参数是指针,就是“门牌号”,所以他们交换的时候是把门牌号进行了交换。所以当你第二次进行访问的时候,原来A房间变成了B房间,所以当你想要让A房间里的人出来的时候,这个时候原来住在里面的B君就出来了。所以发生了交换。
第二个呢,传的是形参,形参就是把A君复制一个(我们理解为克隆一个A君),然后克隆一个B君,最后把克隆人交换。然后我们输出的时候,我们却要A房间里的人,那个时候,A君还在自己的房间,当然他们出来的时候,就是没有交换了。如果,要交换,我们可以输出克隆人。那么看到的结果就是已经发生了交换。
我把第二个代码,给你稍微改下,就是输出克隆人,那么你就会看到,我们原来交换的只是克隆人了。
============
第二个
#includestdio.h
void main()
{void f(int x,int y);
int a,b;
scanf("%d,%d",a,b);
f(a,b);
}
void f(int x,int y)
{int p;
p=x;
x=y;
y=p;
printf("%d,%d",x,y);
}
输入5,9
输出9,5
===========
有不明白的继续追问!
C语言求积分的指针调用函数代码求修改
float integral(float a,float b,(*p)(float x))
应该改为
float integral(float a,float b,float (*p)(float x))
c语言指针型函数
#includestring.h // 导入头文件string.h
#includestdio.h // 导入头文件stdio.h
char *fun(char *t) // 定义函数, 名称fun, 输入参数为char *, 返回值为char *
{
char *p = t; // 把t的值赋值给p, 相当于p指向与t相同的字符串
return p + strlen(t) / 2; // strlen返回值为字符串长度, 然后p位移其一半(向下取整)的距离并返回值
}
int main(int argc, char *argv[])
{
char *str = "abcdefgh"; // str指向字符串“abcdefgh”
str = fun(str); // str调用fun函数, 参数为str, 并将返回值赋值给str
puts(str); // 此时str指向e, 输出为“efgh\n”
return 0;
}