成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高效使用C語言

開發 后端
const關鍵字的是constant的意思,即不變的,在C語言中作為關鍵字來告訴編譯器變量是不可修改的。

使用static關鍵字

static關鍵字有兩個作用,對于變量而言,表示該變量是一個靜態變量,放在數據段中,即使函數運行結束,其變量也仍然存在。對于函數而言,表示該函數的作用域僅在該文件中,其他文件不可訪問,這樣有一個好處,就是當該文件僅僅只被本文件中的函數調用時,此時使用static關鍵字修飾可以避免其他函數因函數名相同而報錯,也就是當使用該關鍵字修飾時,即使兩個文件中的函數名完全相同,也不會報編譯錯誤,例如下面有兩個.c文件,分別是fun1.c和fun2.c。這兩個文件中有函數swap,函數名完全相同。這樣我們可以這樣使用static關鍵字:

//fun1.c
static void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//fun2.c
static void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}

上面兩個文件中有完全一樣的函數,函數只能在各自的文件中使用。

使用const關鍵字

const關鍵字的是constant的意思,即不變的,在C語言中作為關鍵字來告訴編譯器變量是不可修改的。

修飾變量

修飾普通變量

const用來修飾普通變量表示該變量的值不可修改,也就是只讀。比如現在定義一個const a=10,則a的值后面將不可修改。

const int a=10;  //初始化
a=20 //錯誤,a的值不可修改

修飾指針變量

const用來修飾指針變量表示該指針的值不可修改,由于指針有兩個值可以修改,一個是指針的值,即指向的位置,另一個是指針指向的位置的值,為了區分這兩個值是否能修改,編譯器規定采用”就近原則“,即const修飾的是離const最近的。

int a=1,b=2; const int *p=&a;
//修飾的是int *,即表示指針解引不可修改,也就是指針指向的值不能修改,等價int const *p=&a;
*p=10;
//錯誤,p指針指向的值不可修改
p=&b;
//正確,沒有改變p指向變量的值。
int * const q=&a;
//修飾的是指針q,即指針q指向的位置不可修改
q=&b;
//錯誤,q指向的位置不可修改
*q=20;
//正確,沒有修改q指向的位置

修飾數組

const用來修飾數組表示該數組的所有值將不得修改,一般編譯器看到一個const數組會將該數組存放在代碼區中,也就是.text段,這樣該數組將是只讀數據。

const int a[4]={1,2,3,4};
a[1]=20; //錯誤,a數組所有的元素均不可修改 a數組為read only,放在代碼段中

地址對齊

變量地址對齊

地址對齊是一個非常重要的概念,現代編譯器提高代碼的執行速度(主要是配合cache),默認將地址都按照4字節對齊,也即是一個字對齊。我們現在看下面一個結構體:

struct test
{
char a;
int b;
}

如果不了解地址對齊概念的讀者可能會認為上面的結構體一共占1+4=5個字節,實際上是占8個字節,編譯器會按4字節對齊,由于a變量只占一個字節,后面的b變量占4個字節,如果只給a一個字節地址,編譯器會檢測到b變量的地址并不是按4字節對齊的,因此編譯器會默認將分配給b變量的地址向后偏移3個字節,這樣b變量的地址正好的四字節對齊。

#include <stdio.h>
struct test
{
char a;
int b;
};
int main(int argc, char **argv)
{
struct test a;
printf("size of struct test is =%d\n",sizeof(a));
return 0;
}



結構體sshshishi’jshi’ji實際結構

因此在定義一個結構體時為了盡可能節約空間,必須考慮字節對齊問題。下面我們來對比兩個結構體:

#include <stdio.h>
struct A{
int a;
char b;
short c;
};
struct B{
char b;
int a;
short c;
};
int main(int argc, char **argv)
{
struct A st1;
struct B st2;
printf("size of st1 is=%d\n",sizeof(st1));
printf("size of st2 is=%d\n",sizeof(st2));
return 0;
}

運行后結果如下:

兩個完全一樣的結構體,僅僅只是變量存放的位置不同導致其最終所占的空間不同,這就是字節對齊帶來的結果。顯然結構體A要節約內存。

指針地址對齊

既然指針是變量,那是否可以對指針進行位運算呢?比如將指針的值最后一位清零:p&=(~(1)),理論上應該是可行的,因為指針本來就是變量,但實際上編譯器不樂意了,它認為這樣導致指針指向的地址太隨意了,沒有嚴格遵循比類型空間大小,這就導致指針沒辦法進行位運算操作,理論上位運算和算術運算是有等價關系的,因此也可以自己實現指針位運算,這個在C++運算符重載中可能比較方便,因此這里不詳細談指針的位運算了。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2013-01-14 09:29:04

2021-11-11 15:12:21

C語言線程代碼

2011-05-13 17:25:34

C

2011-07-14 09:09:14

const

2010-01-11 09:40:02

C++語言

2025-01-08 10:57:13

2017-05-05 09:45:13

編程語言學習代碼

2023-08-08 13:51:13

Gherkin開發

2011-07-05 16:57:53

C語言

2011-07-05 17:07:14

C語言

2014-08-01 15:16:05

SwiftC語言

2022-09-20 11:07:00

C語言X-MACRO技巧

2010-01-18 17:14:50

C++語言

2023-04-20 17:26:40

FreeDOSC 語言

2015-05-25 15:31:56

C語言學習和使用 C 語言

2025-02-14 08:13:05

AI技術開發

2024-04-10 12:56:00

C#批量插入開發

2010-01-15 17:38:37

C++語言

2021-11-08 23:09:07

Go排序數據

2021-03-08 07:46:53

Git開源控制系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线精品强乱中文字幕 | 韩日在线视频 | 欧美激情亚洲激情 | 国产精品视频网 | 国产视频福利 | 国产色片在线 | 国产午夜精品一区二区三区在线观看 | 国产精品久久久乱弄 | 亚洲欧美日韩在线一区二区 | 男人天堂国产 | 一区二区三区四区不卡视频 | 精品视频免费 | 亚洲成人精品久久 | 久久九精品 | 欧美老少妇一级特黄一片 | 操视频网站| 波多野结衣中文字幕一区二区三区 | 国产一区二区三区在线 | 亚洲三区在线观看 | 精精国产xxxx视频在线 | 日韩毛片中文字幕 | 欧美日韩在线精品 | 91视频免费黄 | 日韩欧美国产一区二区三区 | 日韩精品成人 | 91久久久久久 | 日本一区二区三区四区 | 国产成人精品一区二 | 国产中文字幕在线 | 久久久久久亚洲 | 狠狠色狠狠色综合系列 | 亚洲第一天堂 | 毛片免费在线 | 久久精品一区二区三区四区 | 在线免费观看视频黄 | 伊人精品久久久久77777 | 日韩在线不卡视频 | 在线视频国产一区 | 国产一区二区三区免费 | 国产精品视频久久久 | 一区二区av |