首頁 > 軟體

C語言中static與sizeof查缺補漏篇

2022-07-08 14:08:08

前言

最近學習遇到了很多小難題,今天這篇部落格就來記錄一下最近學習所遇到的一些困惑我的地方,以便於複習。

一、關於關鍵字static

在C語言中:

static是用來修飾變數和函數的

  • 修飾區域性變數-稱為靜態區域性變數
  • 修飾全域性變數-稱為靜態全域性變數
  • 修飾函數-稱為靜態函數

下面我們用程式碼來解釋一下static在c語言中的應用

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修飾區域性變數改變了變數的生命週期,讓靜態區域性變數出了作用域依然存在,到程式結束,生命週期才結束。 簡單來說就是static把原本在棧區上的區域性變數挪到了靜態區,即 可以使變數出了作用域之後不銷燬。

2.static修飾全域性變數

在這裡我們需要在一個工程裡面開闢2個.c檔案,方便我們更清晰的看出static的作用

//程式碼一
       //add.c
int g_val = 2018;
       //test.c
int main()
{
    printf("%dn", g_val);//2018
    return 0;
}
//程式碼2
         //add.c
static int g_val = 2018;
         //test.c
int main()
{
    printf("%dn", g_val);//會報錯
    return 0; }

程式碼一:輸出 2018

程式碼二:在編譯的時候會出現連線性錯誤

所以我們可以得出結論 :一個全域性變數被static修飾,使得這個全域性變數只能在本原始檔內使用,不能在其他原始檔內使用。

3.static修飾函數

我們也需要在一個工程內開闢2個.c檔案方便我們觀察

//程式碼1
     //add.c
int Add(int x, int y)
{
    return x+y;
}
     //test.c
int main()
{
    printf("%dn", Add(2, 3));//  5
    return 0;
}
//程式碼2
      //add.c
static int Add(int x, int y)
{
    return c+y; 
}
      //test.c
int main()
{
    printf("%dn", Add(2, 3));//報錯
    return 0;
}

程式碼一:輸出 5

程式碼二:在編譯的時候會出現連線性錯誤

所以一個函數被static修飾,使得這個函數只能在本原始檔內使用,不能在其他原始檔內使用。

二、sizeof和strlen的區別

我們首先必須知道sizeof是關鍵字!!

strlen是函數!! 兩者有著質的區別

1.sizeof

在c語言中,sizeof在標頭檔案中的型別為unsigned int ,

他的引數可以是指標、陣列、型別、物件、函數等等

2.strlen

在c語言中,strlen()是函數,所以在使用它的時候,就有對應的標頭檔案 <string.h> ,他和sizeof在引數上不同的是,strlen的引數只有字元型指標。

二者區別

二者計算指標長度

眾所周知字串陣列後面會預設有 ‘’ ,下面我們用程式碼來看看二者的區別

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { "abcd" };
	printf("%dn", sizeof(arr));//   5
	printf("%dn", strlen(arr));//   4
	return 0;
}

sizeof遇到 ‘’ 時會將 ‘’ 算入

strlen從第一個地址開始遍歷,遇到 ‘’ (NULL)會立刻返回,但是返回的長度並不包括 ‘’

因此 sizeof在字串陣列內返回的長度總是比strlen多一個

下面我們用程式碼來解釋sizeof和stlen的不同

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { 'a','b','c','d'};
	printf("%dn", sizeof(arr));//   4
//一個字元在記憶體中佔一個位元組,4個字元就佔4個位元組,所以輸出4
	printf("%dn", strlen(arr));//   15
//因為字元陣列並不會預設字元最後有'',所以編譯器就會一直往後找,直到找到''
//但是此時''是隨機的,這取決於編譯器,如果在其他編譯器內執行 列印的結果可能就是其他大於4的亂數,下面我有貼圖片
    char arr1[]={'a','b','c','d',''};	
    printf("%dn", strlen(arr1));//  4
	return 0;
}

三、關於if()內部>與<的正確使用

首先我們來看一道題目

我相信大家剛開始看到這道題目的時候一定和我一樣不理解,字元 ‘c’ 不是比字元 ‘m’ 小嗎,這樣列印出來的不應該是no嗎,可是為什麼列印出來的是yes呢?

我們是這樣解釋的:在c語言中,編譯器都是從左到右依次判斷,因此編譯器會先判斷字元 ‘c’ 是否比字元 ‘m’ 大,顯而易見是假的,因此前面就變成了0,表示假,然後就會判斷0是否比字元 ==‘z’==小,顯而易見 0比 ==‘z‘==小,因此if語句裡面的就是真的,所以我們會列印出 yes。

但是怎樣才會列印出我們想要的結果呢?看下面的程式碼

當我們用 ==&&==這個符號連線時,if語句裡面的意思就是 字元’c‘<‘m’ 且字元’c‘>'m’是列印yes,這就是我們想要的結果了。

到此這篇關於C語言中static與sizeof查缺補漏篇的文章就介紹到這了,更多相關C語言static與sizeof內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com