C語言中static與sizeof查缺補(bǔ)漏篇
前言
最近學(xué)習(xí)遇到了很多小難題,今天這篇博客就來記錄一下最近學(xué)習(xí)所遇到的一些困惑我的地方,以便于復(fù)習(xí)。
一、關(guān)于關(guān)鍵字static
在C語言中:
static是用來修飾變量和函數(shù)的
- 修飾局部變量-稱為靜態(tài)局部變量
- 修飾全局變量-稱為靜態(tài)全局變量
- 修飾函數(shù)-稱為靜態(tài)函數(shù)
下面我們用代碼來解釋一下static在c語言中的應(yīng)用
1.static修飾局部變量
//第一組代碼 #include <stdio.h> void test() { int i = 0; i++; printf("%d ", i);//1 1 1 1 1 1 1 1 1 1 } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; } //第二組代碼 #include <stdio.h> void test() { //static修飾局部變量 static int i = 0; i++; printf("%d ", i);//1 2 3 4 5 6 7 8 9 10 } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
代碼一:輸出為 1 1 1 1 1 1 1 1 1 1
代碼二:輸出為 1 2 3 4 5 6 7 8 9 10
所以static修飾局部變量改變了變量的生命周期,讓靜態(tài)局部變量出了作用域依然存在,到程序結(jié)束,生命周期才結(jié)束。 簡單來說就是static把原本在棧區(qū)上的局部變量挪到了靜態(tài)區(qū),即 可以使變量出了作用域之后不銷毀。
2.static修飾全局變量
在這里我們需要在一個(gè)工程里面開辟2個(gè).c文件,方便我們更清晰的看出static的作用
//代碼一 //add.c int g_val = 2018; //test.c int main() { printf("%d\n", g_val);//2018 return 0; } //代碼2 //add.c static int g_val = 2018; //test.c int main() { printf("%d\n", g_val);//會(huì)報(bào)錯(cuò) return 0; }
代碼一:輸出 2018
代碼二:在編譯的時(shí)候會(huì)出現(xiàn)連接性錯(cuò)誤
所以我們可以得出結(jié)論 :一個(gè)全局變量被static修飾,使得這個(gè)全局變量只能在本源文件內(nèi)使用,不能在其他源文件內(nèi)使用。
3.static修飾函數(shù)
我們也需要在一個(gè)工程內(nèi)開辟2個(gè).c文件方便我們觀察
//代碼1 //add.c int Add(int x, int y) { return x+y; } //test.c int main() { printf("%d\n", Add(2, 3));// 5 return 0; } //代碼2 //add.c static int Add(int x, int y) { return c+y; } //test.c int main() { printf("%d\n", Add(2, 3));//報(bào)錯(cuò) return 0; }
代碼一:輸出 5
代碼二:在編譯的時(shí)候會(huì)出現(xiàn)連接性錯(cuò)誤
所以一個(gè)函數(shù)被static修飾,使得這個(gè)函數(shù)只能在本源文件內(nèi)使用,不能在其他源文件內(nèi)使用。
二、sizeof和strlen的區(qū)別
我們首先必須知道sizeof是關(guān)鍵字??!
strlen是函數(shù)?。?兩者有著質(zhì)的區(qū)別
1.sizeof
在c語言中,sizeof在頭文件中的類型為unsigned int ,
他的參數(shù)可以是指針、數(shù)組、類型、對(duì)象、函數(shù)等等
2.strlen
在c語言中,strlen()是函數(shù),所以在使用它的時(shí)候,就有對(duì)應(yīng)的頭文件 <string.h> ,他和sizeof在參數(shù)上不同的是,strlen的參數(shù)只有字符型指針。
二者區(qū)別
二者計(jì)算指針長度
眾所周知字符串?dāng)?shù)組后面會(huì)默認(rèn)有 ‘\0’ ,下面我們用代碼來看看二者的區(qū)別
#include<stdio.h> #include<string.h> int main() { char arr[] = { "abcd" }; printf("%d\n", sizeof(arr));// 5 printf("%d\n", strlen(arr));// 4 return 0; }
sizeof遇到 ‘\0’ 時(shí)會(huì)將 ‘\0’ 算入
strlen從第一個(gè)地址開始遍歷,遇到 ‘\0’ (NULL)會(huì)立刻返回,但是返回的長度并不包括 ‘\0’
因此 sizeof在字符串?dāng)?shù)組內(nèi)返回的長度總是比strlen多一個(gè)
下面我們用代碼來解釋sizeof和stlen的不同
#include<stdio.h> #include<string.h> int main() { char arr[] = { 'a','b','c','d'}; printf("%d\n", sizeof(arr));// 4 //一個(gè)字符在內(nèi)存中占一個(gè)字節(jié),4個(gè)字符就占4個(gè)字節(jié),所以輸出4 printf("%d\n", strlen(arr));// 15 //因?yàn)樽址麛?shù)組并不會(huì)默認(rèn)字符最后有'\0',所以編譯器就會(huì)一直往后找,直到找到'\0' //但是此時(shí)'\0'是隨機(jī)的,這取決于編譯器,如果在其他編譯器內(nèi)運(yùn)行 打印的結(jié)果可能就是其他大于4的隨機(jī)數(shù),下面我有貼圖片 char arr1[]={'a','b','c','d','\0'}; printf("%d\n", strlen(arr1));// 4 return 0; }
三、關(guān)于if()內(nèi)部>與<的正確使用
首先我們來看一道題目
我相信大家剛開始看到這道題目的時(shí)候一定和我一樣不理解,字符 ‘c’ 不是比字符 ‘m’ 小嗎,這樣打印出來的不應(yīng)該是no嗎,可是為什么打印出來的是yes呢?
我們是這樣解釋的:在c語言中,編譯器都是從左到右依次判斷,因此編譯器會(huì)先判斷字符 ‘c’ 是否比字符 ‘m’ 大,顯而易見是假的,因此前面就變成了0,表示假,然后就會(huì)判斷0是否比字符 ==‘z’==小,顯而易見 0比 ==‘z‘==小,因此if語句里面的就是真的,所以我們會(huì)打印出 yes。
但是怎樣才會(huì)打印出我們想要的結(jié)果呢?看下面的代碼
當(dāng)我們用 ==&&==這個(gè)符號(hào)連接時(shí),if語句里面的意思就是 字符’c‘<‘m’ 且字符’c‘>'m’是打印yes,這就是我們想要的結(jié)果了。
到此這篇關(guān)于C語言中static與sizeof查缺補(bǔ)漏篇的文章就介紹到這了,更多相關(guān)C語言static與sizeof內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言深入探究sizeof與整型數(shù)據(jù)存儲(chǔ)及數(shù)據(jù)類型取值范圍
- C語言詳細(xì)講解常用字符串處理函數(shù)
- 從頭學(xué)習(xí)C語言之字符串處理函數(shù)
- 深入了解C語言中的動(dòng)態(tài)內(nèi)存分配
- C語言深入講解動(dòng)態(tài)內(nèi)存分配函數(shù)的使用
- C語言中main函數(shù)與命令行參數(shù)詳細(xì)講解
- c語言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)
- C語言main函數(shù)的三種形式實(shí)例詳解
- C語言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解
相關(guān)文章
C語言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程
這篇文章主要介紹了C語言中的結(jié)構(gòu)體的入門學(xué)習(xí)教程,以struct語句定義的結(jié)構(gòu)體是C語言編程中的重要基礎(chǔ),需要的朋友可以參考下2015-12-12用C語言舉例講解數(shù)據(jù)結(jié)構(gòu)中的算法復(fù)雜度結(jié)與順序表
這篇文章主要介紹了講解數(shù)據(jù)結(jié)構(gòu)中的算法復(fù)雜度結(jié)與順序表的C語言版示例,包括對(duì)時(shí)間復(fù)雜度和空間復(fù)雜度等概念的簡單講解,需要的朋友可以參考下2016-02-02C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++簡單五子棋的AI設(shè)計(jì)實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++簡單五子棋的AI設(shè)計(jì)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09