c语言 申请变量函数,C语言中变量和函数

C语言中变量和函数

今天我想写一下c语言中的变量和函数.其实以前也对这有所了解,但是今天我觉得才真正了解.(如果说的不对或者说的不够有深度请谅解).

每一个学过c语言的都知道变量和函数的.但是我以前对变量的认识就只有知道它的数据类型.其实在c语言中每一个变量和函数都有两个属性:数据类型和数据的存储类别.在讲这之前,先说说变量的分类.

根据变量的作用域不同可以将变量分为全局变量和局部变量.

局部变量:在函数内部定义的变量,它只在本函数范围内有效,也就是说只有在函数内才能使用它们,在此函数以外是不能使用这些变量的.这对大家都是很熟悉的,这里就不多说了.

全局变量:程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数.在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量也就是全局变量.注意:1.它的有效范围为从定义变量的位置开始到本源文件结束.例如:

intp=1,q=5; /*外部变量*/

float f1(int a)

{int b,c;

...

}

char c1,c2;  /*外部变量*/

char f2(int x,int y)

{int i,j;

......

}

main()

{int m,n;

....

}

p,q,c1,c2 都是全局变量,但是它们的作用范围不一样.在main函数和f2函数中可以使用全局变量p,q,c1,c2,但在函数f1中只能使用全局变量p,q,而不能使用c1和c2.

2.全局变量的作用是增加函数之间数据联系的渠道.由于同一个文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道.由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道.例如:

float Max=0,Min=0;

float average(float array[],int n)

{int i;

float aver ,sum=array[0];

Max=Min=array[0];

for(i=1;i

{if (array[i]>Max)Max=array[i];

else if (array[i]

sum=sum+array[i];

}

aver=sum/n;

return(aver);

}

main()

{float ave,score[10];

int i;

for(i=0;i<10;i++)

sacnf("%f",&score[i]);

ave=average(score,10);

printf("max=%6.2f\min=%6.2f\n",Max,Min,ave);

}

运行结果是:

99 45 97 100 67.5 89 92 66 43

max=100.00

min=43.00

aeverage=77.65

3.建议不在必要时不要使用全局变量,理由:

1).全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元.

2).它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量.如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去.但若该外部变量与其它文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性.

3).如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被"屏蔽",即他不起作用.

根据变量值存在的时间(生存期)可以分为静态存储方式和动态存储方式.

所谓静态存储方式是指在程序运行期间分配固定的存储空间的方式;动态存储方式是指在程序运行期间根据需要动态的分配存储空间的方式.内存中供用户使用的存储空间情况,这个存储空间分为3部分:程序区 静态存储区和动态存储区.

静态存储区主要存放的是全局变量,在程序开始执行的时候给全局变量分配存储区,程序执行完后就释放.在程序执行过程中它们占据固定的存储单元,而不是 动态的进行分配和释放.

在动态存储区中存放的主要是:①函数形式参数.在调用函数的时候给行参分配存储空间.②自动变量.③函数调用是的现场保护和返回地址等.这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间.

根据数据在内存中的存储方式,可分为静态存储方式和动态存储方式,具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern).下面分别做介绍:

⒈auto变量

函数中的局部变量,如果不做专门声明为static存储类别,都是动态的分配存储空间的.数据存储在动态存储区中.这类变量就是我们经常用到的变量,大家都很熟悉就不多做解释.

⒉static声明的变量

①用static声明局部变量

有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下次该函数调用时,改变量已有值,就是上一次函数调用结束时的值.这时就应该指定该局部变量为"静态局部变量",用关键字static进行声明.语法是:static 数据类型 变量名;

说明:

1.静态局部变量属于静态存储类别,在静态存储区内分配存储单元.在程序整个运行期间不释放.而自动变量属于动态存储类别,占动态区空间而不占静态存储区空间,函数调用结束后即释放空间.

2.对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值.以后每次调用函数是不再重新赋初值而只是保留上一次函数调用结束时的值;对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次就重新给一次初值,相当于执行一次赋值语句.

3.如在定义局部变量是不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量).而对自动变量来说,如果不赋初值则它的值是一个不确定的值.

4.虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能调用它.

例子:

int fac(in n)

{ static int f=1;

f=f*n;

return (f);

}

main()

{

int i;

for(i=1;1<=5;i++)

printf("%d! =%d\n",i,fac(i));

}

运行结果:

1!=1;2!=2;3!=6;4!=24;5!=120;

②用static声明全局变量

有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用.这时就可以在定义外部变量时加一个static声明.例

file1.c                   file2.c

static int A;            extern int A;

main()                   fun(int n)

{                           {

...

A=A*n;}

}

在file1.c中定义了一个全局变量A;但它用static声明,因此只能在本文件中使用,虽然在file2.c文件中用"extern int A;",但file2.c文件中无法使用file1.c中的全局变量A.

3.register变量

一般情况下,变量的值是存放在内存中的.当程序中用到那一个变量的值时,由控制器发出命令将内存中该变量的值送到运算器中.经过运算器运算后,如果需要寸数,再从运算器将数据送到内存存放.如果有一些变量使用频繁,则为存取变量要花很长的时间,为了提高效率,c语言允许将局部变量的值存放在cpu中的寄存器中,需要时直接从寄存器取出参加运算,不必到内存.这种变量编译系统自动根据使用情况识别,并自动改变.

4.用extern声明外部变量

如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束.如果在定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作"外部变量声明".表示该变量是一个已定义的外部变量.有了此声明,就可以从"声明"处起合法地使用该外部变量.例:

int max(int x,int y)

{int z;

z=x>y? x:y;

return(z);

}

main()

{extern int A,B;

printf("%d",max(A,B));

}

int A=13,B=-8;

结果是:

13

注意:用extern声明外部变量时,类型名可以写也可以省写.例如在上例中的"extern int A;"也可以写成:"extern A;"

****写到这里就不得不说说声明和定义的区别了.对于函数来说函数的声明是函数原型,而函数的定义是函数的本身.对函数的声明是放在声明部分中的,而函数的定义是显然不在声明的范围之内,他是一个独立的模块.

对变量来说声明就比较复杂,有二中情况:一种是需要建立存储空间的(int a),另一种是不需要建立存储空间的(extern a).前者称为"定义性声明"或者是定义.后者是引用性声明.广义地说,声明包含定义,但并非所有的声明都是定义.对"int a;"而言它既可以是声明,又是定义.而对"extern a;"而言,它是一个声明不是定义.一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明.*******

二:内部函数和外部函数

函数本质上是全局的,因为一个函数要被另外的函数使用,但是,也可以指定函数不能被其他文件调用.根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数.

内部函数:如果一个函数只能被本文件中的其他函数所调用,它称为内部函数.在定义时,在函数名和函数类型的前面加static.即

static 类型标识符 函数名(形参表)   例如:

static int fun (int a ,intb)

内部函数又叫做静态函数.使用内部函数,可以使函数只局限于所在文件,如果在不同文件中有同名的内部函数,互不干扰.

外部函数

⑴在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用.

如函数首部可以写成:

extern int fun(int a,int b)

这样fun函数就可以为其他文件调用.c语言规定:如果在定义函数时省略extern,则隐含为外部函数.

⑵在需要调用此函数的文件中,用extern声明所用的函数是外部函数.

这个错误是由于无法连接到本地主机的10248端口导致的。这个端口通常是kubelet进程监听的端口,用于健康检查。出现这个错误可能是由于kubelet进程没有正确启动或者配置错误导致的。 解决这个问题的方法是检查kubelet进程的状态和配置。你可以按照以下步骤进行操作: 1. 检查kubelet进程是否正在运行。你可以使用以下命令检查kubelet进程的状态: ```shell systemctl status kubelet ``` 如果kubelet进程没有运行,你可以使用以下命令启动它: ```shell systemctl start kubelet ``` 2. 检查kubelet的配置文件。你可以使用以下命令查看kubelet的配置文件路径: ```shell kubelet --kubeconfig /etc/kubernetes/kubelet.conf --config /var/lib/kubelet/config.yaml --bootstrap-kubeconfig /etc/kubernetes/bootstrap-kubelet.conf config view ``` 确保配置文件中的端口号和地址正确,并且与你的环境相匹配。 3. 检查网络连接。你可以使用以下命令检查是否可以连接到localhost10248端口: ```shell curl -sSL http://localhost:10248/healthz ``` 如果无法连接,请确保端口没有被防火墙或其他网络配置阻止。 4. 检查docker的配置。有时候,kubelet进程依赖于docker进程。你可以按照以下步骤检查docker的配置: - 创建/etc/docker目录: ```shell sudo mkdir /etc/docker ``` - 编辑/etc/docker/daemon.json文件,并添加以下内容: ```json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "registry-mirrors": ["https://tdhp06eh.mirror.aliyuncs.com"] } ``` - 重启docker进程: ```shell systemctl restart docker ``` 请注意,以上步骤是一种常见的解决方法,但具体解决方法可能因环境而异。如果以上步骤无法解决问题,请提供更多的错误信息和环境配置,以便我们能够更好地帮助你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值