日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...

發(fā)布時(shí)間:2025/7/14 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本概念: 作用域:起作用的區(qū)域,也就是可以工作的范圍。

代碼塊:所謂代碼塊,就是用{}括起來(lái)的一段代碼。

數(shù)據(jù)段:數(shù)據(jù)段存的是數(shù),像全局變量就是存在數(shù)據(jù)段的

代碼段:存的是程序代碼,一般是只讀的。

棧(stack):先進(jìn)后出。C語(yǔ)言中局部變量就分配在棧中。

局部變量

  普通的局部變量定義的時(shí)候直接定義或者在前面加上auto

void func1(void)
{
int i = 1;
i++;
printf("i = %d.n", i);
}
局部變量i的解析:
在連續(xù)三次調(diào)用func1中,每次調(diào)用時(shí),在進(jìn)入函數(shù)func1后都會(huì)創(chuàng)造一個(gè)新的變量i,
并且給它賦初值1,然后i++時(shí)加到2,
然后printf輸出時(shí)輸出2.然后func1本次調(diào)用結(jié)束,
結(jié)束時(shí)同時(shí)殺死本次創(chuàng)造的這個(gè)i。這就是局部變量i的整個(gè)生命周期。
下次再調(diào)用該函數(shù)func1時(shí),又會(huì)重新創(chuàng)造一個(gè)i,經(jīng)歷整個(gè)程序運(yùn)算,
最終在函數(shù)運(yùn)行完退出時(shí)再次被殺死。

靜態(tài)局部變量(static) 靜態(tài)局部變量定義時(shí)前面加static關(guān)鍵字。

總結(jié):

1、靜態(tài)局部變量和普通局部變量不同。靜態(tài)局部變量也是定義在函數(shù)內(nèi)部的,靜態(tài)局部變量定義時(shí)前面要加static關(guān)鍵字來(lái)標(biāo)識(shí),靜態(tài)局部變量所在的函數(shù)在多調(diào)用多次時(shí),只有第一次才經(jīng)歷變量定義和初始化,以后多次在調(diào)用時(shí)不再定義和初始化,而是維持之前上一次調(diào)用時(shí)執(zhí)行后這個(gè)變量的值。本次接著來(lái)使用。

2、靜態(tài)局部變量在第一次函數(shù)被調(diào)用時(shí)創(chuàng)造并初始化,但在函數(shù)退出時(shí)它不死亡,而是保持其值等待函數(shù)下一次被調(diào)用。下次調(diào)用時(shí)不再重新創(chuàng)造和初始化該變量,而是直接用上一次留下的值為基礎(chǔ)來(lái)進(jìn)行操作。

3、靜態(tài)局部變量的這種特性,和全局變量非常類似。它們的相同點(diǎn)是都創(chuàng)造和初始化一次,以后調(diào)用時(shí)值保持上次的不變。不同點(diǎn)在于作用域不同

全局變量 定義在函數(shù)外面的變量,就叫全局變量。

普通全局變量 普通全局變量就是平時(shí)使用的,定義前不加任何修飾詞。普通全局變量可以在各個(gè)文件中使 用,可以在項(xiàng)目?jī)?nèi)別的.c文件中被看到,所以要確保不能重名。

靜態(tài)全局變量 靜態(tài)全局變量就是用來(lái)解決重名問(wèn)題的。靜態(tài)全局變量定義時(shí)在定義前加static關(guān)鍵字, 告訴編譯器這個(gè)變量只在當(dāng)前本文件內(nèi)使用,在別的文件中絕對(duì)不會(huì)使用。這樣就不用擔(dān)心重名問(wèn)題。所以靜態(tài)的全局變量就用在我定義這個(gè)全局變量并不是為了給別的文件使用,本來(lái)就是給我這個(gè)文件自己使用的。

跨文件引用全局變量(extern) 就是說(shuō),你在一個(gè)程序的多個(gè).c源文件中,可以在一個(gè).c文件中定義全局變量g_a,并且可以在別的另一個(gè).c文件中引用該變量g_a(引用前要聲明)

函數(shù)和全局變量在C語(yǔ)言中可以跨文件引用,也就是說(shuō)他們的連接范圍是全局的,具有文件連接屬性,總之意思就是全局變量和函數(shù)是可以跨文件看到的(直接影響就是,我在a.c和b.c中各自定義了一個(gè)函數(shù)func,名字相同但是內(nèi)容不同,編譯報(bào)錯(cuò)。)。

局部變量和全局變量的對(duì)比:
1、定義同時(shí)沒(méi)有初始化,則局部變量的值是隨機(jī)的,而全局變量的值是默認(rèn)為0.
2、使用范圍上:全局變量具有文件作用域,而局部變量只有代碼塊作用域。
3、生命周期上:全局變量是在程序開(kāi)始運(yùn)行之前的初始化階段就誕生,到整個(gè)程序結(jié)束退出的時(shí)候才死亡;而局部變量在進(jìn)入局部變量所在的代碼塊時(shí)誕生,在該代碼塊退出的時(shí)候死亡。
4、變量分配位置:全局變量分配在數(shù)據(jù)段上,而局部變量分配在棧上。

//static

#include <stdio.h>void func1(void); void func_static(void); void func_static2(void); void func_global(void); void func_register(void);int g_a = 1;int main(void) {//a = 4; // 編譯報(bào)錯(cuò),未定義g_a = 5; // 可以,因?yàn)間_a是全局變量,所以到處都可以用func1(); // i = 2func1(); // i = 2func1(); // i = 2func_static(); // a = 2func_static(); // a = 3func_static(); // a = 4func_static2(); // a = 4;func_static2(); // a = 7;func_static2(); // a = 10;func_global(); // g_a = 4;func_global(); // g_a = 7;func_global(); // g_a = 10;func_register();func_register();func_register();// 因?yàn)閕是定義在函數(shù)func中的局部變量,所以i的作用域?yàn)榇a塊作用域,所以i只在func1 // 函數(shù)內(nèi)部有效,在func1外面是不能訪問(wèn)i的。所以這里i會(huì)無(wú)定義。//i = 5; // error: ‘i’ undeclared (first use in this function)return 0; }void func1(void) {int i = 1; // 普通的局部變量,auto可以省略的//auto int i = 0; // 自動(dòng)局部變量,其實(shí)就是普通局部變量i++;printf("i = %d.n", i); }void func_static(void) {static int a = 1; // 靜態(tài)的局部變量a++;printf("a = %d.n", a); }void func_static2(void) {static int a = 1; // 靜態(tài)的局部變量a += 3;printf("a = %d.n", a); }void func_global(void) {g_a += 3;printf("g_a = %d.n", g_a); }void func_register(void) {register int a = 1; // 靜態(tài)的局部變量a += 3;printf("a = %d.n", a); }

//globle

#include <stdio.h>int g_i = 13;// 實(shí)驗(yàn)結(jié)論: // 首先,main函數(shù)是一個(gè)程序運(yùn)行最開(kāi)始執(zhí)行的東西,所有的其他函數(shù)都只能在main函數(shù)中被 // 直接或者間接的調(diào)用才能被執(zhí)行。main函數(shù)的執(zhí)行其實(shí)就是整個(gè)程序的生命周期,main函數(shù) // 一return返回,整個(gè)程序就結(jié)束了。 // 其次,全局變量的定義和初始化是在main函數(shù)運(yùn)行之前發(fā)生的。 int main(void) {printf("g_i = %d.n", g_i);return 0; }#include <stdio.h>void func_in_a(void); extern int g_a; // 聲明了一個(gè)int變量g_a //extern int g_b;void func_in_b(void) {printf("I am func in b.c.n"); }int main(void) {printf("I am main in a.c.n");printf("I am main in a.c, g_a = %d.n", g_a);printf("I am main in a.c, g_a = %d.n", g_b);//func_in_b(); // 直接調(diào)用func_in_a(); // 間接調(diào)用return 0; }#include <stdio.h>void func_in_b(void);int g_a = 12; int g_b = 111;void func_in_a(void) {g_a = 24;printf("I am in func_in_a of a.c, g_a = %d.n", g_a);func_in_b(); }/* // 定義錯(cuò)誤 // C語(yǔ)言中,定義函數(shù)都必須在外面,不能在一個(gè)函數(shù)里面定義別的函數(shù) // 所以沒(méi)有局部函數(shù),只有全局函數(shù)。void func1(void) {int a;void func2(){int b;} }*/

//最后兩個(gè)分別為a.c b.c 文件目錄為

C/C++學(xué)習(xí)資料分享交流群:1093776732 入群有全套學(xué)習(xí)視頻資料電子書免費(fèi)贈(zèng)送!

參考資料:

物聯(lián)網(wǎng)開(kāi)發(fā)入門直播課 - 嵌入式/物聯(lián)網(wǎng)-C語(yǔ)言編程基礎(chǔ)?www.makeru.com.cn嵌入式開(kāi)發(fā)直播課 - 帶你提升C編程能力?www.makeru.com.cn嵌入式底層開(kāi)發(fā) - 夯實(shí)C語(yǔ)言,從小白到大牛的進(jìn)階之路!?www.makeru.com.cn嵌入式開(kāi)發(fā)直播課 - 嵌入式-指針?www.makeru.com.cn

總結(jié)

以上是生活随笔為你收集整理的c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。