c函数与变量存储.docx
- 文档编号:26301752
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:15
- 大小:18.81KB
c函数与变量存储.docx
《c函数与变量存储.docx》由会员分享,可在线阅读,更多相关《c函数与变量存储.docx(15页珍藏版)》请在冰豆网上搜索。
c函数与变量存储
函数与变量存储
函数与变量存储1
1.函数1
1.1.函数的形式参数和实际参数。
1
1.2.数组参数2
1.3.函数的嵌套调用4
1.4.函数指针变量4
2.变量的存储5
2.1.变量的作用域5
2.2.变量的生存期7
3.练习题7
1.函数
在程序设计中,将一些常用的功能模块编写成函数。
1.1.函数的形式参数和实际参数。
在函数定义时函数名后面括号中的变量名称为形式参数,当函数被调用时,函数名后面括号中的参数成为实际参数。
在未出现函数调用时,函数的形式参数不分配内存单元,只有在函数被调用时,形参才分配内存单元,以接受实参传过来的值。
C++参数的传递采用按值传递的方式。
对函数形参的值的修改不会影响到实参的值。
intadd(inti,intj)
{
intz=i+j;
returnz;
}
intsub(inti,intj)
{
intz=i-j;
returnz;
}
intmain(intargc,char*argv[])
{
inta=30;
intb=100;
intc=add(a,b);
intd=sub(b,a);
return0;
}
带默认参数的函数,调用带默认参数的函数时,实参与行参按照从左至右的顺序匹配,如
intGetMax(inti1,inti2,inti3=100)
{
if(i1 i1=i2; returni1>i3? i1: i3; } 参数个数可变函数,参数个数可变函数必须由编写者约定参数结束的标志。 支持参数个数可变的函数的一般形式为 返回值类型函数名(类型参数,...) voidMyOut(constchar*pszPara,...) { va_listlist; va_start(list,pszPara); while(pszPara) { cout< pszPara=va_arg(list,char*); } va_end(list); cout< } 内联函数、函数的重载、函数模版将在面向对象的课程中讲。 1.2.数组参数 //Parameter.cpp: Definestheentrypointfortheconsoleapplication. // #include"stdafx.h" #include #include usingnamespacestd; voidPrintSize(charszParam[]) { cout<<"sizeofszParam[]: "< } voidPrintSize2(charszParam[3]) { cout<<"sizeofszParam[3]: "< } voidPrintSize3(charszParam[8]) { cout<<"sizeofszParam[8]: "< } voidPrintSize4(char*pszParam[8]) { cout<<"sizeof*pszParam[8]: "< } voidPrintSize5(charszArrayParam[100][4]) { cout<<"sizeof*szArrayParam[100][5]: "< } voidPrintSize6(charszArrayParam[][4]) { cout<<"sizeof*szArrayParam[][4]: "< } /* 建议: */ voidProcessString(char*pszParam); voidProcessString(char**ppszParam,intiStrCount); intmain(intargc,char*argv[]) { charszText[3]; char*pszArray[3]; charszArray[3][4]; PrintSize(szText); PrintSize2(szText); PrintSize3(szText); PrintSize4(pszArray); PrintSize5(szArray); PrintSize6(szArray); return0; } 1.3.函数的嵌套调用 分析下列求阶承函数的调用机理。 UINTFac(UINTnParam) { if(nParam<2) return1; else returnnParam*Fac(nParam-1); } Fac(3); 1.4.函数指针变量 指针变量可以指向一个函数,一个函数在被编译时被分配给一个入口地址。 这个函数的入口地址就被称为函数的指针。 函数指针变量声明的一般形式为 类型(*函数指针变量名)(参数列表,..); #include #include typedefvoid(*FN_NOTIFY)(constchar*pszMsg); voidNotify1(constchar*pszMsg) { printf("Notify1: %s\n",pszMsg); } voidNotify2(constchar*pszMsg) { printf("Notify2: %s\n",pszMsg); } voidProcess(FN_NOTIFYpFn) { constintMAX_LOOP=100; charszBuf[32]; inti,iRand; for(i=0;i iRand=int(rand()); if(iRand%9==0) { sprintf(szBuf,"%d",iRand); pFn(szBuf); } } } intmain() { FN_NOTIFYpFn; pFn=Notify1; Process(pFn); pFn=Notify2; Process(pFn); return0; } 2.变量的存储 2.1.变量的作用域 2.1.1.局部变量 在一个函数内部定义的变量或者在复合语句中定义的变量称为局部变量,同一作用域内不允许出现同名的变量,同名变量的使用遵循最近作用域优先的原则。 voidfoo(inti1,inti2) { inti3,i4; i3=3; i4=4; { inti3,i5; i3=3333; i5=5; cout<<”inblock: ”< } cout<<”infunction: ”< } 2.1.2.全局变量 在函数、结构体、类外面定义的变量为全局变量。 因为全局变量在程序运行期间都占用存储空间;函数的可移植性降低;变量的变化难以跟踪,所以建议尽量少用全局变量。 #include"stdafx.h" #include usingnamespacestd; intg_iCount; voidfoo() { cout< //cout< } intg_iQty=0; intmain(intargc,char*argv[]) { g_iCount=1; foo(); cout< return0; } 跨文件的全程全局变量。 如果在一个文件中按普通方式定义一个全局变量,那么在另外一个文件中可以通过extern声明的方式来使用该全局变量。 例如在b.cpp中定义了一个全局变量: //b.cpp intg_iCount; 那么在a.cpp中可以通过先声明该变量,然后直接使用它,而不必#include“b.cpp” //a.cpp voidPrintByA() { externintg_iCount; cout< } 文件内的全局变量。 如果在一个文件中用static声明一个静态全局变量,那么该变量只在该文件中可见,在其它文件中不可见,除非#include该文件。 假设在b.cpp中定义了一个全局变量 //b.cpp staticintg_iCount; 那么文件a.cpp只有通过#include“b.cpp”才能够访问b.cpp文件中的全局变量 //a.cpp #include“b.cpp” voidPrintByA() { cout< } 2.2.变量的生存期 ●全局变量在程序的整个运行期间均有效。 ●函数内的普通局部变量在函数调用期间有效。 (重点讲解) ●函数内的静态局部变量在程序的整个运行期间有效。 ●堆内分配的变量的生命期从创建变量开始(new、malloc()、strdup(),HeapAlloc()),一直到变量释放(delete、free()、HeapFree())。 (重点讲解) int**ppi; ppi=newint*[2]; ppi[0]=newint[3]; ppi[1]=newint[10]; //ppi[0][0]=3; //... delete[](ppi[0]); delete[](ppi[1]); delete[]ppi; //如果要把{"ab","cdef"}赋值给char**ppsz呢 3.练习题 1、写一个可变参数个数的函数,输入N个整数,返回N个整数之和。 2、写一函数IsDigit,判断输入的字符是否是数字字符。 3、写一函数将char型数组转换成两个16进制字符输出,如’a’--‘6’,’1’ 4、写一函数将char型数组转换成16进制字符串输出,如’a’--“61” 5、输入一个1-7的数,输出对应的星期几的英文字符串。 如1--“MONDAY” 6、字符串处理函数: //******************************************************************* //功能: 获取字符串的长度 //输入: pszParam--字符指针(字符串) //输出: 无 //返回: pszParam字符串的长度 //******************************************************************* intStrLen(constchar*pszParam); //******************************************************************* //功能: 字符串拷贝 //输入: pszDst--目标字符串指针 //pszSrc--源字符串指针 //输出: 无 //返回: 目标字符串指针 //******************************************************************* char*StrCpy(char*pszDst,constchar*pszSrc); //******************************************************************* //功能: 在源字符串中找子字符串,并返回子字符串在源字符串首次出现处 //的指针 //输入: pszSrc--源字符串 //pszSub--子字符串 //输出: 无 //返回: 子字符串在源字符串首次出现处的指针,如果未找到,返回NULL //******************************************************************* char*FindStr(constchar*pszSrc,constchar*pszSub); //******************************************************************* //功能: 从控制台读入一字符串到pszParam中,pszParam最多能存放 //iMaxStrLen个字符。 根据控制台的换行符号和iMaxStrLen判断输入结 //束,回车和换行符号不包含在pszParam中 //输入: pszParam--目标缓冲区,存放输入的字符。 //iMaxStrLen--pszParam最多能存放的字符数。 //输出: 无 //返回: pszParam字符串指针 //******************************************************************* char*ReadStr(char*pszParam,intiMaxStrLen); //******************************************************************* //功能: 从控制台读入iStrCount个字符串,每个字符串最长为iMaxStrlen, //最后用指针的指针的方式将这组字符串返回。 //输入: iStrCount--要求输入的字符串数量 //iMaxStrLen--每个字符串的最大长度。 //输出: 无 //返回: 指向这组字符串的指针。 //******************************************************************* char**ReadStrs(intiStrCount,intiMaxStrLen); //******************************************************************* //功能: 释放字符串指针以及所指向的所有字符串的内存 //输入: ppszParam--字符指针的指针(字符串指针) //iStrCount--字符串个数 //输出: 无 //返回: 无 //******************************************************************* voidFreeStrs(char**ppszParam,intiStrCount); 7、写一函数,输入一文件名,读取文件中的数据,并转换成16进制的字符串输出。 8、写一函数,输入一文件夹名,打印出该文件夹下的所有文件名和所有子文件夹名。 9、写一函数,输入一文件夹名,将文件夹下的所有文件名以一个字符指针的指针的形式返回。 10、写一函数,输入一文件夹名,按层次递规输出所有文件名和子文件夹名。 11、请计算sizeof的值 charstr[]=“Hello”; char*p=str; intn=10; 请计算 sizeof(str)= sizeof(p)= sizeof(n)= voidFunc(charstr[100]) { 请计算 sizeof(str)= } void*p=malloc(100); 请计算 sizeof(p)= 12、 voidGetMemory(char*p) { p=(char*)malloc(100); } voidTest(void) { char*str=NULL; GetMemory(str); strcpy(str,"helloworld"); printf(str); } 请问运行Test函数会有什么样的结果? 答: char*GetMemory(void) { charp[]="helloworld"; returnp; } voidTest(void) { char*str=NULL; str=GetMemory(); printf(str); } 请问运行Test函数会有什么样的结果? 答: VoidGetMemory2(char**p,intnum) { *p=(char*)malloc(num); } voidTest(void) { char*str=NULL; GetMemory(&str,100); strcpy(str,"hello"); printf(str); } 请问运行Test函数会有什么样的结果? 答: voidTest(void) { char*str=(char*)malloc(100); strcpy(str,“hello”); free(str); if(str! =NULL) { strcpy(str,“world”); printf(str); } } 请问运行Test函数会有什么样的结果? 答:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 变量 存储