
#include <stdioh>
main()
{
char str[80]="d:\\files\\dataFiles\\data\\avatarbmp"; // 单斜杠处填双斜杠
int L,i;
L = strlen(str);
for (i=L-1;i>=0;i--) if (str[i] == '\\') { str[i] ='\0'; break;}; // 去掉文件名就是路径
printf("Path= %s",str);
return 0;
}
-----------
写成函数和调用:
#include <stdioh>
void fun(char str){
int L,i;
L = strlen(str);
for (i=L-1;i>=0;i--) if (str[i] == '\\') { str[i] ='\0'; break;};
}
main()
{
char str[80]="d:\\files\\dataFiles\\data\\avatarbmp";
fun(str);
printf("Path= %s",str);
return 0;
}
只要定义一个函数指针(按照要调用的函数形式进行定义),将要调用的函数名赋予它,即可调用。
#include <stdioh>typedef void(pfun)(int x); // 指针函数:指向void返回,带参数int参数的函数
void output(int x)
{
printf("x: %d\n", x);
}
int main()
{
pfun p = output; // 将output函数指针赋予p
p(10); // 通过函数指针调用函数
return 0;
}
test是函数名,那么&test得到的是函数指针。指称一个函数的函数名(函数表达式)可以隐式转换为对应的函数指针;在函数调用时函数和指向相同函数的函数指针是等价的。所以LZ的用法中test和&test没什么区别,p(8)和p(8)没什么区别,q(8)和q(8)也没什么区别。
类似的情况还有指称整个数组的数组名。一元运算符&作用于数组,得到的是数组的首个元素的指针;而在其它许多情况下引用数组名即得到隐式转换成的指向首个元素的指针。
另外,LZ的printf用法不规范。输出指针用%p不是%d。
PS关于函数,在语言层次上C和C++的处理有些不同,例如C中虽然函数类型不是对象类型,但函数表达式通过隐式转化为指针而成为左值;而C++中函数类型表达式也是左值。不过表面上来看,(只用C和C++的公共特性时)C/C++中它们的行为是一致的。
====
[原创回答团]
要知道main函数也是由其他的程序调用的。
我们编写的程序,最终是不存在所谓的函数名的,有的只有内存单元地址0xffeedd00
我们的程序执行时,程序加载到内存,比方说整个程序所占用的内存范围是0xffee0000 ~ 0xffeedd00,这么多。
假设程序有一个小函数fun(),那么它的范围可能是0xffee0000~0xffee00ff。
那么函数fun()的入口地址是多少? 0xffee0000。。
那么函数名fun实际上就是0xffee0000的别称。
你用一个指针指向这个函数,那么你把 指针 = 函数名,实际就是把0xffee0000这个内存单元的地址给指针p。
所以,结论是:
函数名 是 程序在执行时, 函数所占内存单元块的 首地址 的别称。
首先函数返回一个指针类型即返回地址。
例:
int func(void)
{
int a= 10;
int p = &a;
return p;
}
以上就是关于C语言试题 编写一个获取文件路径的函数全部的内容,包括:C语言试题 编写一个获取文件路径的函数、C语言能通过函数的地址调用函数吗、C/C++中函数的地址的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)