int a = 10;
int arr[10];//這種定義在c99下是合法的,只不過所有windows下的編譯器都不支援,在gcc下可順利執行。
指標陣列:指標陣列可以說成是」指標的陣列」,首先這個變數是乙個陣列,其次,」指標」修飾這個陣列,意思是說這個陣列的所有元素都是指標型別 。
char *arr[4] = ;
//這個陣列呢有四個元素,每個元素都是char*型別的指標。
陣列指標:陣列指標可以說成是」陣列的指標」,首先這個變數是乙個指標,其次,」陣列」修飾這個指標,意思是說這個指標存放著乙個陣列的首位址,或者說這個指標指向乙個陣列的首位址。
char (*pa)[4];
//pa是乙個指標指向乙個char [4]的陣列,每個陣列元素是乙個char型別的變數。
int brr[3][4] = ,,};//brr[0][6] = 6 因為二維陣列的分配是連續的,所以當看似越界時,可先往後分析。
void show(int arr[3][4])
int main()
這個部分最重要的應該就是結構體的位元組數問題。
位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個準則:
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)
如果不進行記憶體對齊,cpu在訪問時效率就會很低,例如結構體裡面有個char有個int,假設記憶體每次訪問四個位元組,不進行記憶體對齊,則先訪問char和int的三個位元組,再訪問int的第四個位元組,然後剔除第乙個位元組,合併第二個到第五個位元組,很麻煩。
//32位下,所有指標型別都是4位元組,64位下所有指標都是8位元組
/*1、找出結構體中最寬的基本型別成員大小。
2、依此大小為寬根據位元組對齊準則進行計算。
*//*32位下 24位元組
a(4) d(4)
b(4) c(4)
e(8)
64位下 32位元組
a(8)
d(8)
b(4)c(4)
e(8)
*/struct t ;
int main()
date; //20
/*記憶體分布如下:
cat(4) a1(4)
a2(4) a3(4)
a4(4) a5(4)
dog(8)
*/struct data // 32
too;
int main()
{ date max;
data d;
cout
va_start(list,a);//找到...開頭
va_arg(list,int);//從...取資料
va_end(list)//判斷結束
C語言複習 二
引言 不會將每乙個部分都詳述,只關注於一些自己認為重要的或常錯的,若有不足,還望指出 switch 細節 括號內必須是整型或列舉型別 遇到break才會跳出 case包含的必須是常量 continue 停止本次迴圈,重新開始下次迭代 函式的三要素 返回值型別,函式名稱,形式引數列表 在呼叫函式時,需...
C語言複習總結篇(二)
1 棧stack 棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂 top 另一端為棧底 bottom 棧底固定,而棧頂浮動 向低位址擴充套件的資料結構,是一塊連續的記憶體區域 棧中元素個數為零時稱為空棧。插入一般稱為進棧 push 刪除則稱為退棧 pop 棧也稱...
C 複習筆記 第二次
物件導向的基本特點 抽象 例項 鐘錶類 class clock 封裝 類與物件的定義 設計類就是設計型別 要考慮到這些 類成員的訪問控制 類的成員函式 內聯成員函式 建構函式 建構函式的作用 建構函式的形式 隱含生成的建構函式 預設建構函式 default 給建構函式賦初值例 class clock...