程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話中static的感化及C說話中應用靜態函數有何利益

C說話中static的感化及C說話中應用靜態函數有何利益

編輯:關於C++

C說話中static的感化及C說話中應用靜態函數有何利益。本站提示廣大學習愛好者:(C說話中static的感化及C說話中應用靜態函數有何利益)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中static的感化及C說話中應用靜態函數有何利益正文


想懂得Java中static症結字的感化和用法具體引見,請點擊此處懂得概況。

在C說話中,static的字面意思很輕易把我們導入邪路,其實它的感化有三條,分離是:

一是隱蔽功效,關於static潤飾的函數和全局變量而言

二是堅持耐久性功效,關於static潤飾的部分變量而言。

三是由於寄存在靜態區,全局和部分的static潤飾的變量,都默許初始化為0

上面我一一給年夜家引見:

(1)先來引見它的第一條也是最主要的一條:隱蔽。

當我們同時編譯多個文件時,一切未加static前綴的全局變量和函數都具有全局可見性。為懂得這句話,我舉例來講明。我們要同時編譯兩個源文件,一個是a.c,另外一個是main.c。

上面是a.c的內容

char a = 'A'; // global variable
void msg() 
{
 printf("Hello\n"); 
}

上面是main.c的內容

int main(void)
{ 
 extern char a; // extern variable must be declared before use
 printf("%c ", a);
 (void)msg();
 return 0;
}

法式的運轉成果是:

A Hello

你能夠會問:為何在a.c中界說的全局變量a和函數msg能在main.c中應用?後面說過,一切未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能拜訪。此例中,a是全局變量,msg是函數,而且都沒有加static前綴,是以關於別的的源文件main.c是可見的。

假如加了static,就會對其它源文件隱蔽。例如在a和msg的界說前加上static,main.c就看不到它們了。應用這一特征可以在分歧的文件中界說同名函數和同名變量,而不用擔憂定名抵觸。Static可以用作函數和變量的前綴,關於函數來說,static的感化僅限於隱蔽,而關於變量,static還有上面兩個感化。

(2)static的第二個感化是堅持變量內容的耐久。存儲在靜態數據區的變量會在法式剛開端運轉時就完成初始化,也是獨一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不外和全局變量比起來,static可以掌握變量的可見規模,說究竟static照樣用來隱蔽的。固然這類用法不罕見,但我照樣舉一個例子。

#include <stdio.h>
int fun(void){
 static int count = 10; // 現實上此賦值語句歷來沒有履行過
 return count--;
}
int count = 1;
int main(void)
{ 
 printf("global\t\tlocal static\n");
 for(; count <= 10; ++count)
  printf("%d\t\t%d\n", count, fun()); 
 return 0;
}

 法式的運轉成果是:

global          local static

1               10

2               9

3               8

4               7

5               6

6               5

7               4

8               3

9               2

10              1

(3)static的第三個感化是默許初始化為0。其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區。在靜態數據區,內存中一切的字節默許值都是0x00,某些時刻這一特色可以削減法式員的任務量。好比初始化一個稀少矩陣,我們可以一個一個地把一切元素都置0,然後把不是0的幾個元素賦值。假如界說成靜態的,就省去了一開端置0的操作。再好比要把一個字符數組當字符串來用,但又認為每次在字符數組末尾加'\0'太費事。假如把字符串界說成靜態的,就省去了這個費事,由於那邊原來就是'\0'。無妨做個小試驗驗證一下。

#include <stdio.h>
int a;
int main(void)
{
 int i;
 static char str[10];
 printf("integer: %d; string: (begin)%s(end)", a, str);
 return 0;
}

法式的運轉成果以下

integer: 0; string: (begin)(end)

最初對static的三條感化做一句話總結。起首static的最重要功效是隱蔽,其次由於static變量寄存在靜態存儲區,所以它具有耐久性和默許值0。

以上內容是關於c說話中static的感化。

上面給年夜家引見C說話中應用靜態函數的利益。

 C說話中應用靜態函數的利益:

靜態函數會被主動分派在一個一向應用的存儲區,直到加入運用法式實例,防止了挪用函數時壓棧出棧,速度快許多。
症結字“static”,譯成中文就是“靜態的”,所之內部函數又稱靜態函數。但此處“static”的寄義不是指存儲方法,而是指對函數的感化域僅局限於本文件。 應用外部函數的利益是:分歧的人編寫分歧的函數時,不消擔憂本身界說的函數,能否會與其它文件中的函數同名,由於同名也沒有關系。

c說話中static的語義1.static變量:1).部分a.靜態部分變量在函數內界說,生計期為全部源法式,但感化域與主動變量雷同,只能在界說該變量的函數內應用。加入該函數後, 雖然該變量還持續存在,但不克不及應用它。b.對根本類型的靜態部分變量若在解釋時未賦以初值,則體系主動付與0值。而對主動變量不賦初值,則其值是不定的。2).全局全局變量自己就是靜態存儲方法, 靜態全局變量固然也是靜態存儲方法。然則他們的感化域,非靜態全局 變量的感化域是全部源法式(多個源文件可以配合應用); 而靜態全局變量則限制了其感化域, 即只在界說該變量的源文件內有用, 在統一源法式的其它源文件中不克不及應用它。2.static函數(也叫外部函數)只能被本文件中的函數挪用,而不克不及被統一法式其它文件中的函數挪用。差別於普通的非靜態函數(內部函數) static在c外面可以用來潤飾變量,也能夠用來潤飾函數。 先看用來潤飾變量的時刻。變量在c外面可分為存在全局數據區、棧和堆裡。其實我們日常平凡所說的客棧是棧而不包括對,不要弄混。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved