c语言程序中变量先引用声明,C语言如何跨文件调用函数定义中声明的变量
變量的作用域
我們知道,變量根據(jù)其作用域有全局變量和局部變量之分。全局變量作用域是整個(gè)文件,并且可以使用關(guān)鍵字?extern?達(dá)到跨文件調(diào)用的目的。但是局部變量值作用于它當(dāng)前所在的塊(即該變量所處最內(nèi)層中括號(hào)之間的區(qū)域),當(dāng)函數(shù)執(zhí)行完并離開當(dāng)前塊后,局部變量及其所處內(nèi)存空間的值就會(huì)銷毀。
static?關(guān)鍵字
static?+ 變量聲明 表示聲明的這個(gè)變量是靜態(tài)變量。靜態(tài)不是說(shuō)它的值不會(huì)被改變,而是它在內(nèi)存中的地址靜止不動(dòng),這也就意味著它的值從一直到函數(shù)運(yùn)行結(jié)束之前,都不會(huì)被銷毀。有趣的是,它聲明的的變量只會(huì)聲明一次,再次調(diào)用聲明語(yǔ)句時(shí),會(huì)自動(dòng)跳過這條語(yǔ)句。如下面這段代碼:
#include
int main()
{
int i = 0;
printf("num1\tnum2\n");
for(i = 0;i<4;i++)
{ static int num1 = 4;
int num2 = 4;
num1 ++;
num2 ++;
printf("%d\t%d\n",num1,num2)
}
}
運(yùn)行結(jié)果為:
可以看到static初始化的num1變量,雖然我們放在循環(huán)中,看起來(lái)好像每次都會(huì)對(duì)變量進(jìn)行初始化,但是結(jié)果卻出人意表,num1在循環(huán)中沒有受到初始化語(yǔ)句的影響,可以正常的進(jìn)行運(yùn)算。
指針
指針是一個(gè)值為內(nèi)存地址的變量(或數(shù)據(jù)對(duì)象)。指針本身是不具有內(nèi)存的,但是它可以通過賦值,指向其他變量的地址進(jìn)而得到它的內(nèi)存。因?yàn)樵谟?jì)算機(jī)中,所有的變量都會(huì)有單獨(dú)一塊內(nèi)存空間,所以理論上,只要使用指針指向變量的地址,就可以在程序的任何位置調(diào)用變量。所以,指針是我們實(shí)現(xiàn)跨文件跨域調(diào)用變量最重要的手段。
使用指針跨文件調(diào)用變量
有了上面的基礎(chǔ),我們就可以開始調(diào)用變量了。為了表現(xiàn)跨文件的功能,我們定義一個(gè)頭文件?test.h?,并且在里面放入一個(gè)函數(shù)聲明?void Input();?,然后我們?cè)賱?chuàng)建一個(gè)?test.c?文件來(lái)作為頭文件的實(shí)現(xiàn)文件。最后在主文件?main.c?中調(diào)用它,函數(shù)代碼如下:
test.c文件
#include "test.h"
int *ptr; //聲明一個(gè)外部指針用來(lái)調(diào)用變量
void Input()
{
//初始化一個(gè)靜態(tài)的數(shù)組
static int nums[10] = {1,2,3,4,5,6,7,8,9,10};
ptr = nums; //將外部指針指向數(shù)組首地址
}
main.c文件
#include "test.h" //引用我們自定義的頭文件
#include
extern int *ptr; //調(diào)用我們的外部指針
int main()
{
Input(); //初始化數(shù)組并給指針賦值
//下面打印結(jié)果,驗(yàn)證是否成功調(diào)用變量
for(int i = 0;i<10;i++)
{
printf("%d\t",*(ptr + i));
}
}
運(yùn)行結(jié)果為
可以看到,我們通過一個(gè)外部指針,在?Input()?函數(shù)內(nèi)部將指針指向變量的地址,成功的調(diào)用了在其他文件的函數(shù)內(nèi)部聲明的數(shù)組/變量。
事實(shí)上,在這里面,static?關(guān)鍵字起到了至關(guān)重要的作用。我們嘗試將nums[]數(shù)組改成普通的自動(dòng)(auto)變量,看看運(yùn)行結(jié)果:
運(yùn)行結(jié)果為
可以看到,循環(huán)打印出來(lái)的是一片混亂的數(shù)值,這意味著指針向內(nèi)存的數(shù)值已經(jīng)被銷毀了
閱讀原文
總結(jié)
以上是生活随笔為你收集整理的c语言程序中变量先引用声明,C语言如何跨文件调用函数定义中声明的变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽脂一次多少钱啊?
- 下一篇: c语言实验报告管理系统,C语言实验报告-