c函数与变量存储.docx

上传人:b****6 文档编号:13764315 上传时间:2023-06-17 格式:DOCX 页数:15 大小:18.81KB
下载 相关 举报
c函数与变量存储.docx_第1页
第1页 / 共15页
c函数与变量存储.docx_第2页
第2页 / 共15页
c函数与变量存储.docx_第3页
第3页 / 共15页
c函数与变量存储.docx_第4页
第4页 / 共15页
c函数与变量存储.docx_第5页
第5页 / 共15页
c函数与变量存储.docx_第6页
第6页 / 共15页
c函数与变量存储.docx_第7页
第7页 / 共15页
c函数与变量存储.docx_第8页
第8页 / 共15页
c函数与变量存储.docx_第9页
第9页 / 共15页
c函数与变量存储.docx_第10页
第10页 / 共15页
c函数与变量存储.docx_第11页
第11页 / 共15页
c函数与变量存储.docx_第12页
第12页 / 共15页
c函数与变量存储.docx_第13页
第13页 / 共15页
c函数与变量存储.docx_第14页
第14页 / 共15页
c函数与变量存储.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

c函数与变量存储.docx

《c函数与变量存储.docx》由会员分享,可在线阅读,更多相关《c函数与变量存储.docx(15页珍藏版)》请在冰点文库上搜索。

c函数与变量存储.docx

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函数会有什么样的结果?

答:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2