c語言static

c語言static

平臺用戶的互動中精選與c語言static相關的:1、C語言里面靜態變量static是什么作用? 2、C語言編程中“static”是什么意思? 3、在C語言中static有什么含義 4、c語言中static 到底有啥作用? 5、c語言 static靜態變量 6、c語言 static 作用范圍是什么呢? 7、請問C語言中static函數的具體作用是什么,,請不要copy答案哦。。 8、C語言中static 的詳細說明。 9、c語言中static int i=1什么意思 10、c語言中static int 和int有什么區別?
c語言static
平臺用戶 2018-06-06 16:51:37

下面是精選平臺用戶互動時的最佳討論

野生路由器
野生路由器


野生路由器:C語言里面靜態變量static是什么作用?

初學者。。 題目是這樣的 #include<stdio.h> void Caculate() { static int iSum=3; int iTemp; iTemp=iSum; //iSum是靜態變量 iSum=iTemp*3; printf("%d\n",iSum); } int main() { Caculate(); //得到iSum的平方 Caculate(); //得... 初學者。。
題目是這樣的
#include<stdio.h>

void Caculate()
{
static int iSum=3;
int iTemp;
iTemp=iSum; //iSum是靜態變量
iSum=iTemp*3;
printf("%d\n",iSum);
}
int main()
{
Caculate(); //得到iSum的平方
Caculate(); //得到iSum的立方
return 0;
}

然后運行結果是
9
27
Press any key to continue

在第二次調用Caculate()函數的時候,不是又重新賦值變量iSum=3了嗎,為什么第二次調用的時候,iSum=3沒有作用呢?
下面的解答已被8781人點贊
static關鍵字在C語言中用于聲明一個靜態的局部變量。
作用:
有時希望函數中的局部變量的值在函數調用結束后不消失而繼續保留原值,即其占用的存儲單元不釋放,在下一次再調用該函數時,該變量已有值(就是上一次函數調用結束時的值)。這時就應該指定該局部變量為“靜態局部變量”,用關鍵字static進行聲明。

用靜態存儲要多占內存(長期占用不釋放,而不能像動態存儲那樣一個存儲單元可以先后為多個變量使用,節約內存),而且降低了程序的可讀性,因此若非必要,不要多用靜態局部變量。
最后一次編輯時間 推薦于2018-03-02 10:38:40
351125153
351125153


351125153:C語言編程中“static”是什么意思?

下面的解答已被7429人點贊
static 出現在不同的地方含義不同的。
如果是在函數之外使用,表示該對像在此文件中是全局可訪問的,在文件之外是不可訪問的。
如果出現在函數內部,則表示該變量不是自動變量,它是一個可以初始化的變量(如果不進行顯式初始化,默認值是0)。改變了它的值以后,函數結束時它的值也會保留。
最后一次編輯時間 推薦于2017-09-23 03:18:52
5564ad
5564ad


5564ad:在C語言中static有什么含義

謝謝,好像不止一個意思吧~~~
下面的解答已被7652人點贊
是不止一個意思,要看用到哪里。比如:
static int a;
int b;
void func(void)
{
static int c;
int d;
}
在這里,a與b都是全局變量,二者的區別是,b可以被別的文件使用,a只能在本文件中使用,這是static對全局變量的作用。
c和d的區別是,d是一個自動變量,func函數執行完后,d會自動被釋放。但c卻不會被釋放,下一次調用func函數時,c的值會保留上次的值繼續使用。
最后一次編輯時間 推薦于2017-11-24 11:25:26
105069789
105069789


105069789:c語言中static 到底有啥作用?

舉個程序來說 #include <stdio.h> int f(int x) { static int a=3; a+=x; return a; } void main () { int k=2,m=1,n; n=f(k); n=f(m); printf("%d",n); } 我想知道 走n=f(m)的時候 那個 static int a=3; 不生效?a為什么... 舉個程序來說

#include <stdio.h>
int f(int x)
{
static int a=3;
a+=x;
return a;
}

void main ()
{
int k=2,m=1,n;
n=f(k);
n=f(m);
printf("%d",n);
}
我想知道 走n=f(m)的時候

那個 static int a=3; 不生效?a為什么還是 n=f(m)之后得的結果呢?

講講這個就行,我要考試~
下面的解答已被1576人點贊
  在C語言中,static的作用有三個,分別如下:
  1、隱藏;
  當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。
  2、保持變量內容的持久;
  存儲在靜態數據區的變量會在程序剛開始運行時就完成初 始化,也是唯一的一次初始化。
  3、默認初始化為0;
  在靜態數據區,內存中所有的字節默認值都是0x00,某些 時候這一特點可以減少程序員的工作量。
最后一次編輯時間 推薦于2017-09-30 08:19:31
langtj
langtj


langtj:c語言 static靜態變量

#include "iostream.h"
int p(int x)
{
static int y=1;
y=y+1;
return (x+y);}
int main()
{
cout<<p(1)<<endl;
cout<<p(2)<<endl;}

答案是3和5,為什么不是3和4呢?
那再一次調用的時候難道 static int y=1; 這句就沒有意義不運行了?
下面的解答已被7623人點贊
c語言的static變量是在程序加載的時候就為之分配內存的,一直到程序結束,而不像普通變量那樣函數執行一次分配一次。所以當第一次執行p(1)的時候,y已經加1了,下次執行p(2)時,y不會恢復成1,還是2;你就當全局變量的功能處理就行,性能上有區別
最后一次編輯時間 推薦于2017-09-15 13:47:29
一朵時光_bobo
一朵時光_bobo


一朵時光_bobo:c語言 static 作用范圍是什么呢?

下面的解答已被3612人點贊

static的作用有三條。

一、第一個作用:隱藏。

當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。

你可能會問:為什么在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,并且都沒有加static前綴,因此對于另外的源文件main.c是可見的。

如果加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。Static可以用作函數和變量的前綴,對于函數來講,static的作用僅限于隱藏,而對于變量,static還有下面兩個作用。

二、static的第二個作用是保持變量內容的持久。

存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。

三、static的第三個作用是默認初始化為0。

其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。

請添加詳細解釋

最后一次編輯時間 2018-03-30
yonder88
yonder88


yonder88:請問C語言中static函數的具體作用是什么,,請不要copy答案哦。。

下面的解答已被310人點贊

C語言中static函數的具體作用是:

  1. 讓一個變量長期有效,而不管其是在什么地方被申明。

  2. 避免多個文件使用了相同的變量名而導致沖突。

C語言里面的靜態函數和函數的區別是:

  1. 靜態函數是函數的一種,函數包括靜態函數和非靜態函數兩種。

  2. 靜態函數是有static修飾的函數,如果沒有,則為非靜態函數(全局函數)。

  3. 當整個程序只有一個C文件時,二者沒有區別,當程序是由多個C文件組成時,二者的作用域,即可使用的范圍不同。

  4. 靜態函數(帶static的),只能在本文件中使用,無法跨文件,而非靜態函數(不帶static的),可以在任何一個文件中使用。當在其它文件中使用時,需要做函數聲明后再使用。

最后一次編輯時間 2018-03-31
匿名
匿名


匿名:C語言中static 的詳細說明。

下面的解答已被9384人點贊
google了近三頁的關于C語言中static的內容,發現可用的信息很少,要么長篇大論不知所云要么在關鍵之處幾個字略過,對于想挖掘底層原理的初學者來說參考性不是很大。所以,我這篇博文博采眾家之長,把互聯網上的資料整合歸類,并親手編寫程序驗證之。
C語言代碼是以文件為單位來組織的,在一個源程序的所有源文件中,一個外部變量(注意不是局部變量)或者函數只能在一個源程序中定義一次,如果有重復定義的話編譯器就會報錯。伴隨著不同源文件變量和函數之間的相互引用以及相互獨立的關系,產生了extern和static關鍵字。
下面,詳細分析一下static關鍵字在編寫程序時有的三大類用法:
一,static全局變量
我們知道,一個進程在內存中的布局如圖1所示:

其中.text段保存進程所執行的程序二進制文件,.data段保存進程所有的已初始化的全局變量,.bss段保存進程未初始化的全局變量(其他段中還有很多亂七八糟的段,暫且不表)。在進程的整個生命周期中,.data段和.bss段內的數據時跟整個進程同生共死的,也就是在進程結束之后這些數據才會壽終就寢。
當一個進程的全局變量被聲明為static之后,它的中文名叫靜態全局變量。靜態全局變量和其他的全局變量的存儲地點并沒有區別,都是在.data段(已初始化)或者.bss段(未初始化)內,但是它只在定義它的源文件內有效,其他源文件無法訪問它。所以,普通全局變量穿上static外衣后,它就變成了新娘,已心有所屬,只能被定義它的源文件(新郎)中的變量或函數訪問。
以下是一些示例程序
file1.h如下:
[cpp] view plaincopy
#include <stdio.h>

void printStr();
我們在file1.c中定義一個靜態全局變量hello, 供file1.c中的函數printStr訪問.
[cpp] view plaincopy
#include "file1.h"

static char* hello = "hello cobing!";

void printStr()
{
printf("%s\n", hello);
}
file2.c是我們的主程序所在文件,file2.c中如果引用hello會編譯出錯
[cpp] view plaincopy
#include "file1.h"

int main()
{
printStr();
printf("%s\n", hello);
return 0;
}
報錯如下:
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:6: 錯誤:‘hello’ 未聲明 (在此函數內第一次使用)
file2.c:6: 錯誤:(即使在一個函數內多次出現,每個未聲明的標識符在其
file2.c:6: 錯誤:所在的函數內只報告一次。)

如果我們將file2.c改為下面的形式:
[cpp] view plaincopy
#include "file1.h"

int main()
{
printStr();
return 0;
}
則會順利編譯連接。
運行程序后的結果如下:
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
[[email protected] static]$ ./file2
hello cobing!

上面的例子中,file1.c中的hello就是一個靜態全局變量,它可以被同一文件中的printStr調用,但是不能被不同源文件中的file2.c調用。

二,static局部變量
普通的局部變量在?臻g上分配,這個局部變量所在的函數被多次調用時,每次調用這個局部變量在棧上的位置都不一定相同。局部變量也可以在堆上動態分配,但是記得使用完這個堆空間后要釋放之。
static局部變量中文名叫靜態局部變量。它與普通的局部變量比起來有如下幾個區別:
1)位置:靜態局部變量被編譯器放在全局存儲區.data(注意:不在.bss段內,原因見3)),所以它雖然是局部的,但是在程序的整個生命周期中存在。
2)訪問權限:靜態局部變量只能被其作用域內的變量或函數訪問。也就是說雖然它會在程序的整個生命周期中存在,由于它是static的,它不能被其他的函數和源文件訪問。
3)值:靜態局部變量如果沒有被用戶初始化,則會被編譯器自動賦值為0,以后每次調用靜態局部變量的時候都用上次調用后的值。這個比較好理解,每次函數調用靜態局部變量的時候都修改它然后離開,下次讀的時候從全局存儲區讀出的靜態局部變量就是上次修改后的值。
以下是一些示例程序:
file1.h的內容和上例中的相同,file1.c的內容如下:
[cpp] view plaincopy
#include "file1.h"

void printStr()
{
int normal = 0;
static int stat = 0; //this is a static local var
printf("normal = %d ---- stat = %d\n",normal, stat);
normal++;
stat++;
}
為了便于比較,我定義了兩個變量:普通局部變量normal和靜態局部變量stat,它們都被賦予初值0;
file2.c中調用file1.h:
[cpp] view plaincopy
#include "file1.h"

int main()
{
printStr();
printStr();
printStr();
printStr();
printf("call stat in main: %d\n",stat);
return 0;
}
這個調用會報錯,因為file2.c中引用了file1.c中的靜態局部變量stat,如下:
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
file2.c: In function ‘main’:
file2.c:9: 錯誤:‘stat’ 未聲明 (在此函數內第一次使用)
file2.c:9: 錯誤:(即使在一個函數內多次出現,每個未聲明的標識符在其
file2.c:9: 錯誤:所在的函數內只報告一次。)
編譯器說stat未聲明,這是因為它看不到file1.c中的stat,下面注掉這一行:
[cpp] view plaincopy
#include "file1.h"

int main()
{
printStr();
printStr();
printStr();
printStr();
// printf("call stat in main: %d\n",stat);
return 0;
}
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
[[email protected] static]$ ./file2
normal = 0 ---- stat = 0
normal = 0 ---- stat = 1
normal = 0 ---- stat = 2
normal = 0 ---- stat = 3
運行如上所示?梢钥闯,函數每次被調用,普通局部變量都是重新分配,而靜態局部變量保持上次調用的值不變。
需要注意的是由于static局部變量的這種特性,使得含靜態局部變量的函數變得不可重入,即每次調用可能會產生不同的結果。這在多線程編程時可能會成為一種隱患。需要多加注意。

三,static函數
相信大家還記得C++面向對象編程中的private函數,私有函數只有該類的成員變量或成員函數可以訪問。在C語言中,也有“private函數”,它就是接下來要說的static函數,完成面向對象編程中private函數的功能。
當你的程序中有很多個源文件的時候,你肯定會讓某個源文件只提供一些外界需要的接口,其他的函數可能是為了實現這些接口而編寫,這些其他的函數你可能并不希望被外界(非本源文件)所看到,這時候就可以用static修飾這些“其他的函數”。
所以static函數的作用域是本源文件,把它想象為面向對象中的private函數就可以了。
下面是一些示例:
file1.h如下:
[cpp] view plaincopy
#include <stdio.h>

static int called();
void printStr();
file1.c如下:
[cpp] view plaincopy
#include "file1.h"

static int called()
{
return 6;
}
void printStr()
{
int returnVal;
returnVal = called();
printf("returnVal=%d\n",returnVal);
}
file2.c中調用file1.h中聲明的兩個函數,此處我們故意調用called():
[cpp] view plaincopy
#include "file1.h"

int main()
{
int val;
val = called();
printStr();
return 0;
}
編譯時會報錯:
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
file1.h:3: 警告:‘called’ 使用過但從未定義
/tmp/ccyLuBZU.o: In function `main':
file2.c:(.text+0x12): undefined reference to `called'
collect2: ld 返回 1
因為引用了file1.h中的static函數,所以file2.c中提示找不到這個函數:undefined reference to 'called'
下面修改file2.c:
[cpp] view plaincopy
#include "file1.h"

int main()
{
printStr();
return 0;
}
編譯運行:
[[email protected] static]$ gcc -Wall file2.c file1.c -o file2
[[email protected] static]$ ./file2
returnVal=6

static函數可以很好地解決不同原文件中函數同名的問題,因為一個源文件對于其他源文件中的static函數是不可見的。
最后一次編輯時間 推薦于2018-05-10 18:04:24
匿名
匿名


匿名:c語言中static int i=1什么意思

下面的解答已被4606人點贊

這個要看兩種情況的:

  1. 這個語句是放在函數內,那么這就是一個靜態局部變量,當函數結束內存不釋放,它的生命周期等同全局變量;

  2. 這個語句放在函數歪,那么表示這個是一個不可跨文件的全局變量,這個變量不可以被其余的源程序文件extern。

最后一次編輯時間 推薦于2017-05-21 21:38:52
匿名
匿名


匿名:c語言中static int 和int有什么區別?

下面的解答已被7376人點贊
在main里面的區別不大,其它函數里面區別很大,static變量能保持上次調用后的結果,int在函數返回后就銷毀了,下次調用又重新建立。
最后一次編輯時間 推薦于2017-04-19 17:16:54
金蟾捕鱼单机下载