c语言动态调用函数
① c语言中动态内存分配函数的用法及作用(比如malloc,calloc,realloc等)
先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)
1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?
2。如果用动态分配,就解决上述问题了。当你需要多大内存时,就给你多大——如果有的话——这就是动态分配的意义。
现在看上述问题的代码,我调试过的:
----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* calloc、exit需要声明头文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可对任意个整数排序;\n");
printf("请输入整数的总个数: ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); /* calloc函数的使用 */
if(p==0) {
printf("分配失败!\n");
exit(1); /* 当分配失败时,exit可以终止程序 */
}
printf("请输入这些整数:\n");
for(i=0;i<n;i++)
scanf("%d",p+i); /* 利用指针移位的方法赋值 */
for(i=1;i<n;i++) /* 冒泡排序法 */
{
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("将这些整数从小到大排列输出为:");
for(i=0;i<n;i++)
{
if(i%5==0) printf("\n"); /* 每隔5个数换行 */
printf(" %11d;",*(p+i));
/* 为了整齐,每个数占11个字符,当数字很多时这很重要 */
}
printf("\n");
free(p); /* 释放空间 */
}
----------------------------------------------------------------------
调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。
malloc、calloc、realloc的用法(以上述问题为例)及区别:
1。malloc(n*sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 */
2。calloc(n,sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0 */
3。realloc(p,sizeof(int)*n) /* 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候。个人觉得没用——不够就找到原分配处改大一点不就行了?! */
我能说得只有这些了,有些东西看起来麻烦,当你小试一下就会发现,不过如此嘛!学C要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……
希望我的回答对您有帮助!
② C语言编写动态链接库以及在程序中调用动态链接库中的函数。 随便什么...
#include<stdio.h>
int main()
{int max(int x;int y);
int a,b,m;
printf("请输入要比较的数用逗号隔开:");
scanf("%d,%d",&a,&b);
m=max(a,b);
printf("最大的数为:%d",m);
return 0;
}
int max(int x,int y)
{int z;
if(x>y)z=x;
else z=y;
return(z);
}
③ 如何用C语言调用C++做成的动态链接库
C的是不能直接调用C++的
你可以封装一个库
C++的,里面用extern "C"
封装函数,用这个函数调用C++的库
然后 你的C语言程序,调用这个中转库的函数就好。
比如
在你C++库里面,有一个void my_func(int)的话,直接调用my_func是不可能的
在中转库写
extern"C"{
voidmy_func_c(inta)
{
my_func(a);
}
}
然后在纯C程序中, 调用my_func_c就好了。
④ c语言中定义一个动态一维数组的函数,然后在主函数中使用
如果要获取内存地址,你上面那种函数获取方法是错误的.函数中int *a仅仅是主函数变量ff的一个副本,ff当初没有具体指明地址,传递给a也是不确定地址,a分配完毕,只是修改a自身指向,并不修改ff指向.所以用下面方法进行修改,采用返回地址方法
#include <stdio.h> //包含头文件
#include <stdlib.h>
int *array1(int x)//使用返回指针能正确分配内存地址
{
int *a;
a=(int*)malloc(sizeof(int)*x);
if(a==NULL)
exit(0);
for(int i=0;i<x;i++)
*(a+i)=0;
return a;
}
void main()
{
int *array1(int x);//函数声明与函数定义相一致
int *ff;
int sdof;//定义sdof
sdof=8;
ff = array1(sdof);
for(int i=0;i<sdof;i++)
printf("%d\n",*(ff+i));
}
⑤ C语言如何调用函数
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
#include<stdio.h>
intfun(intx,inty);//函数声明,如果函数写在被调用处之前,可以不用声明
voidmain()
{
inta=1,b=2,c;
c=fun(a,b);//函数的调用,调用自定义函数fun,其中a,b为实际参数,传递给被调用函数的输入值
}
//自定义函数fun
intfun(intx,inty)//函数首部
{//{}中的语言为函数体
returnx>y?x:y;//返回x和y中较大的一个数
}
(5)c语言动态调用函数扩展阅读
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。
这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。
图表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
⑥ 单片机C语言如何实现数组动态调用
sizeof一般是在编译时计算,不适合用在你这种情况,如下修改已仿真验证可切换传送。
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*********端口定义*************/
//SCLK串行同步时钟
//SID串行数据输入端
//CS片选,高#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*********端口定义*************/
//SCLK串行同步时钟
//SID串行数据输入端
//CS片选,高电平有效
sbitCS=P1^2;
sbitSID=P1^1;
sbitSCLK=P1^0;
/******************************/
/*******字幕显示定义***********/
ucharcodeTable1[]={"ILoveMCU"};
ucharcodeTable2[]={"我爱单片机!"};
/******************************/
voidDelaynms(ucharx)
{
uchari,j;
for(i=0;i<x;i++)
{
for(j=0;j<110;j++);
}
}
voidDatComOperation(uchardatas,uchardatcom)
{
uchartemp;
uinti;
temp=datas;
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
temp=datcom;
temp&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
temp=datcom;
temp<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(temp&0x80);
SCLK=0;
SCLK=1;
temp<<=1;
}
CS=0;
Delaynms(10);
}
voidSendCommand(ucharcomm)//12232发送指令
{
DatComOperation(0xf8,comm);
}
voidSendData(uchardatas)//12232发送数据
{
DatComOperation(0xfa,datas);
}
voidLcd12Initial()
{
Delaynms(100);
SendCommand(0x30);
SendCommand(0x02);
SendCommand(0x06);
SendCommand(0x0c);
SendCommand(0x01);
SendCommand(0x80);
}
voidDispInfor(ucharx,ucharcode*arrays)//???????
{
uchari,j;
SendCommand(x);//定义字符显示的位置
//for(i=0;i<sizeof(arrays)/sizeof(arrays[0]);i++)
//SendData(arrays[i]);
i=0;
while(j=arrays[i++])SendData(j);
}
voidmain()
{
Lcd12Initial();
DispInfor(0x80,Table1);//DisInfor(0x80,Table1);
DispInfor(0x90,Table2);//DisInfor(0x90,Table2);
while(1);//等待
}
⑦ C语言如何动态调用一个函数
定义声明一个函数 需要的时候在主函数里调用就行
⑧ c语言中用函数调用,用动态分配方式,把字符数组输出。
#include
<stdio.h>
#include
<string.h>
#include
<malloc.h>
using
namespace
std;
void
display(char
*str){
for(int
i
=
0
;
i
<
strlen(str)
;
i++)
{
printf("%c"
,
str[i])
;
}
printf("\n");
}
void
getChar(char
*str){
scanf("%s"
,
str)
;
}
int
main(){
int
len
=
128
;
char
*str
=
(char
*)malloc(len
*
sizeof(char))
;
while(true){
printf("请输入一些字符:");
getChar(str)
;
printf("您输入的字符为:");
display(str)
;
printf("\n");
}
}
⑨ c语言中怎么调用函数谢谢
C语言中,函数调用的一般形式为:函数名(实际参数表)对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。
#include<stdio.h>
int fun(int x, int y); // 函数声明,如果函数写在被调用处之前,可以不用声明
void main()
{
int a=1, b=2, c;
c = fun(a, b); // 函数的调用,调用自定义函数fun,其中a,b为实际参数,传递给被调用函数的输入值
}
// 自定义函数fun
int fun(int x, int y) // 函数首部
{ // {}中的语言为函数体
return x>y ? x : y; // 返回x和y中较大的一个数
}
函数实参
函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y)); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题是求值顺序的问题。
所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。
以上内容参考:网络-函数调用
⑩ C语言编写的动态库中的函数,如何才能被C++调用
有对应的静态库吗?
有的话,加入项目编译,然后把动态库放到运行的地方就可以了。
如果没有的话,就需要编写代码调用了。
这里有篇比较好的文章
http://www.cnblogs.com/lhbssc/archive/2012/02/08/2342853.html