1樓:匿名使用者
區域性變數一般佔用的是堆疊的空間,如果堆疊溢位會有問題的。
c語言「區域性變數作用域」的問題
2樓:紅柿子炒番茄
做為c語言的過來人給你真正的解答,希望能幫到你!
你是想問為什麼呼叫了add();函式後為啥在main()函式里面num值還是3,而在add();函式里面num變成了4對吧?
我從三個方面給你解答:作用域有三種:1**塊作用域 2函式原型作用域 3檔案作用域。
首先解答關於你標題問的關於「區域性變數作用域」:因為你的變數是在函式內部宣告的,就像你在main()函式里面宣告的一樣,它的作用域為**塊作用域,從該變數被定義的地方到包含該定義的**塊的末尾該變數均是可見的。
函式的性質你也需要明白,編寫一個c語言函式基本分為三部分1.函式原型宣告 2.函式呼叫 3.
函式定義;你編寫的add()函式就是這樣。在函式原型宣告中可以不寫變數名因為對於編譯器來說它只關心引數的型別和引數數目(函式原型的參量具有函式原型作用域,參量從宣告開始到宣告結束),而在函式定義中的變數如你寫的void add(int num)中的num在函式定義中為也是屬於區域性變數,它也具有**塊作用域(儘管num在**塊的外部),而且這個add()函式中的num和你main()中的num不是同一個變數(你可以試著換其它名字結果還是一樣)
在main函式中你呼叫了add(num);這個num為實參,而void add(int num)函式中的num為形參,這樣做的目的是把main的num的值賦值給了add函式的形參num(而且這兩個num不在同一個namespace裡面所以你可以宣告兩個相同的num但是並不是同一個變數),你只是得到了數值的拷貝,也就是說你儘管改變了add()函式中的num但是並沒有改變main()中的num,我想你應該還沒學到指標,不用指標的方式也可以通過add()函式改變main()中的num; 你只需要這樣寫:
int add(int); 這裡我把函式的返回型別宣告為了int
int main(void)
int add(int num)
有不懂可以繼續問,希望能幫到你。
3樓:聽不清啊
沒有什麼不對啊。完全正常的。
因為從main()呼叫add( )函式時的實參num=3在完成了傳遞值以後,main( )與add( )函式的變數之間就相互沒有了關係。add( )函式中num++並輸出4以後,對main( )函式中的變數沒有絲毫的關係,所以返回後,輸出main( )中的num的值仍是3。
4樓:熱情的大神
add函式里面的num是另一個變數,和主函式中的num不一樣。它們兩都是臨時變數,除了變數名相同沒有什麼關係。
add函式只是通過引數的方式獲取了主函式里面的num的值,也就是給了add中的num初始值,但是並沒有把計算後的值返回給主函式中的num,所以主函式中的num並沒有被改變。
main()
//把變數名換一下就明白了,這個變數和num是兩回事,和區域性變數作用域沒有半毛錢關係。
void add(int aa)
5樓:風若遠去何人留
這個和區域性變數作用域沒什麼關係。
而是傳參方式。
add函式傳值呼叫, 而不是傳指標呼叫。
所以在add中改變形參num的值,不會影響主函式中實參num的值。
6樓:it圈新鮮事
**註釋部分是正確的。函式傳參是值傳遞,並沒有返回計算值,所以在main函式中num的值仍為3。這樣寫就很清楚了。傳遞的變數名與之前的值是不同含義的。
#include
void add(int);
int main()
void add(int x) /值傳遞。
7樓:技術宅男摩羯
add函式相當於一個子函式,內部的num只存在add內,當呼叫結束後,主函式內的num不受影響。
所以主函式輸出3,add函式輸出4.
望採納,謝謝!
8樓:匿名使用者
題主說的不對是哪個地方?
雖然在main函式和add函式中,變數名都是num,但它們是兩個東西。
為方便描述,稱前者為num1後者為num2。
num1的作用域範圍為其宣告到main()的}為止。num2的作用域範圍為其宣告到add()的}為止。在main()的整個生命週期中,num1一直存在。
在add()的整個宣告週期中,num2一直存在。一旦函式結束,則釋放相應變數所佔用的記憶體空間。
因此,每次在呼叫add()時,系統會為num2分配一個新的空間,並將num1的值賦給num2,在add()結束後,釋放num2空間。在add()的整個生命週期中,記憶體存在有兩個num(即num1和num2),add()對num的所有操作都是對num2這個新的空間裡的值進行的操作。因此不會影響同名的num1的狀態。
如果你希望對num1的值進行操作,請將num1的地址賦給num2,並使用*訪問num1的值。
9樓:匿名使用者
這裡涉及到變數作用域的問題,區域性變數的作用域從宣告開始,到所在函式的結束,,在子函式內的變數,同名的其他變數將被暫時遮蔽。所以會出現以上情況。在add函式內,add內的sum將暫時遮蔽main內的sum,但這兩個sum並不是同意變數,你可以將他們在記憶體的地址列印出來證明一下。
這時候add的sum接收傳入的值3,自增後為4,將列印4,在add函式結束後,main內的sum恢復作用,但他們不是同意變數,所以main內的sum值並沒有改變。
10樓:匿名使用者
傳值與傳址的區別,你的寫法是傳值,即傳遞了main裡num的副本,而不是main裡num的地址,add函式里面改變的是形參的值,並不能改變main裡面num的值。
為了達到你的預期,我們可以:
//傳遞引用。
void add(int&);
main()
void add(int num&)
//傳遞地址。
void add(int*);
main()
void add(int *num)
11樓:lz鬥逗
沒有錯的地方啊,先執行函式add,輸出4,再回到主函式輸出3,結果是4,3.因為add函式里num是區域性變數,不改變主函式中的變數,如果要改變只能通過指標,採納一下。
12樓:skys晨曦
沒有問題啊,我剛剛也試了下c++,可以執行,結果也沒錯,注意加上標頭檔案#include 就行了。
第一次輸出的是4;第二次輸出的是3;
是因為先呼叫函式,執行函式內部程式,其中就先列印了4;然後返回主函式,列印3;
13樓:丁方
main函式里面的num和add函式里面的num不是同一個num, 各自進行運算互不影響。
所以main函式里面的num輸出為3
add裡面的num的值有main函式傳過來的值為3進行了一次自加, 得到4
所以add裡面額num輸出結果為4
14樓:神話杜十三
printf("%d",num); 輸出變數num值為3
你指的不對,是這裡嗎?
關於「區域性變數作用域」
首先,c語言的函式引數是值傳遞。也就是說,num這個變數,在main函式和add函式中是兩個不同變數。
區域性變數的作用域是當前函式,出了函式就釋放了。
15樓:谷歌地
沒有不對啊,形參就是不會改變原來的位置的值的啊為什麼呢。
你可以選擇死記硬背。
或者這樣理解:
直接在main裡面呼叫的時候傳入3,而不是變數num也就是說在mian中這樣寫add(3);
假如形參是可以改變main裡面的變數的值。
那是不是把常量3改成4了,常量都被改變了,那還叫什麼常量所以「形參是可以改變main裡面的變數的值」這個論據不成立有問題追問。
16樓:傻十三
不太清楚你想要表達什麼。我給你解釋一下這段**吧。
在main函式里先呼叫add函式,傳入的引數是3,該引數被賦值給一個臨時變數num,num自加1然後輸出,add函式呼叫結束,銷燬add函式里的臨時變數num。然後輸出main函式的num變數,由於傳參的方式是傳值而不是傳地址,所以main函式里的num的值並不改變。
17樓:潮範君
void add(int);
main()
void add(int num) /形參//先輸出4 再輸出3 正確的啊。
18樓:弈軒
首先標頭檔案#include 不能少。
#include
void add(int);
main()
void add(int num)
你的提問描述不準確,你是不是想問實現 main裡面的num,呼叫add()函式後,num的實際值增加1?
19樓:網友
#include ""基本輸入輸出標頭檔案要呼叫。
void add(int num); 引數中要有變數,不能只有型別名。
main()
void add(int num)
20樓:網友
//註釋的描述應該都對沒有錯。
//如果說時編譯不過,時因為缺少標頭檔案和main函式返回型別#include
void add(int);
void main()
void add(int num)
21樓:黎明之鳥
//num傳遞到add內部後結果不會影響num本身的除非用的是全域性變數或者指標,void add(int *num);
main()
void add(int *pnum)
22樓:岔路程式緣
這個題目先列印4,再列印3,執行正常呀,**不對了??
不是變數作用域問題,而是函式呼叫的形參與實參問題:
先看add函式,它需要一個整型變數做引數,引數的名字是num,這個num叫形參。注意函式的形參只在函式內部有效。
再來看主函式,它在呼叫add函式時,使用的引數也是num,這個叫實參。它正好與形參的名字相同。實際情況是,不管形參與實參名字相同與否,呼叫時,系統都會建立一個新的貯存單元,並把實參的值放進去,類似形成實參的一個副本,那麼這個貯存單元就是形參的貯存器,以後add函式形參所做的一切變化如賦值,均是對副本的操作,而不會影響實參那個貯存單元裡存放的值。
本題恰好使用的相同名字的形參和實參,對人是一種迷惑。假定把形參變成除num之外其它名字的變數,主函式呼叫正常進行,你就會發現形參與實參的區別了。如:
void add(int);
main()
void add(int n)//n是形參,它單獨貯存你可以自己試一試。
多執行緒呼叫同一個方法,區域性變數會共享嗎
23樓:匿名使用者
區域性變數不會受多執行緒影響。
成員變數會受到多執行緒影響。
多個執行緒呼叫的同一個物件的同一個方法:
如果方法裡無成員變數,不受任何影響。
如果方法裡有成員變數,只有讀操作,不受影響,存在賦值操作,有影響。
c區域性變數求助
用函式返回值來傳遞動態記憶體這種方法雖然好用,但是常常有人把return 語句用錯 了。這裡強調不要用return 語句返回指向 棧記憶體 的指標,因為該記憶體在函式結束時 自動消亡,如下例 char getstring void void test4 void 解決方法兩種 1函式返回值來傳遞動態...
成員變數和區域性變數區別,Java中,成員變數和區域性變數的區別是什麼?
樓主是否對類的概念已經清楚了?如果是的話,就很好解釋了。成員變數是類的一個組成部分,和類的方法處於同一級別 而區域性變數是為了讓方法 功能正常執行設立的一些臨時儲存單元,是專門服務於方法的。從概念上說,兩者是完全沒有關係的,但從應用上說,成員變數可能臨時做為區域性變數存在,而區域性變數也可能依賴或者...
axure 8 0怎麼設定區域性變數
站著的氣球 區域性變數local variable 預設顯示名稱lvar1,lvar2 作用範圍為一個case裡面的一個事務,一個事件裡面有多個case,一個case裡面有多個事務,可見區域性變數的作用範圍非常小。例如在case裡面要設定一個條件的話,如果用到了區域性變數,這個變數只在這個條件語句裡...