1. 優先級及”++”
執行代碼:
int a = 1;
int b = 0;
int c = 0;
int d = (++a) * (c = 1);
則a,b,c,d的值分別是多少?
2,0,1,2
2. bool 類型與float 類型使用if判斷“零值”
bool flag;
if(flag) 或 if(!flag)
float x = 0.001;
if(x <= 0.001)
3.數據類型的轉換
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b>6) ? puts(">6") : puts("<=6");
}
輸出:
>6
有符號數與無符號數轉換規則, 將轉換爲無符號類型。
-20 的機器數爲FFFF FFECH
則a+b大於 6
所以儘量使用無符號數,來保證數據類型的統一。
4.預處理指令
C語言的編譯預處理指令均以“ # ”開頭。例如:#pragma,#define。
sizeof 爲運算符,malloc 爲函數。
5.頭文件
在#include <filename.h>
和#include "filename.h"
的區別?
1.使用宏指令#include <filename.h>
是通知編譯器在預處理時要包含開發環境中提供的名爲filename.h 的頭文件。
2.使用宏指令#include "filename.h"
是要求編譯器在預處理時優先包含編譯者指定路徑下的名爲filename.h的頭文件,如果在指定路徑下沒有發現名爲filename.h的頭文件,則使用系統提供的頭文件。
6. .h文件標準開頭
#ifndef DIALOG_H // 判斷如果沒有宏定義DIALOG_H,則執行;如果已經定義DIALOG_H則不執行。
#define DIALOG_H // 宏定義 DIALOG_H
...代碼段
#endif // DIALOG_H // 結束
作用是防止該頭文件被重複引用。
7.內存分配
棧:由編譯器進行管理,自動分配和釋放。
堆:用於程序動態申請分配和釋放空間。
全局(靜態)存儲區:分爲DATA段和BSS段。DATA段存放初始化的全局變量和靜態變量;BSS段存放未初始化的全局變量和靜態變量。
程序代碼段:存放程序的二進制代碼。
8.static作用
- 在一個函數中說明一個靜態變量。
- 在一個模塊內說明一個靜態變量,可以被模塊內所有函數訪問,但不能被模塊外其他函數訪問。
- 在一個模塊內說明一個靜態的函數,靜態函數只能被同一模塊內的其他函數嵌套調用,使函數本地化。
9.數組與指針
具有相同類型的指針類型變量p
與數組a
,不能進行的操作是(D)
A. p = a; B. *p = a[0]; C. p = &a[0]; D. p =&a;
選項D:&a 的含義是取數組指針(即得到的地址的數據類型是指向數組的指針),與指針變量p的類型不匹配。可修改爲 p = (int *)&a;
#include <stdio.h>
int main()
{
int a[4] = {1, 2, 3, 4};
int *ptr = (int *)(&a + 1);
printf("%d\r\n",(*ptr - 1));
return 0;
}
輸出:4
解析:在函數中,a爲int類型數組,數組名a也代表數組a的起始地址。&a的含義是指向數組a的指針( 即int()[4] ),表達式(&a+1)的含義是指向下一個有4個int元素的整型數組,即(&a+1)在數值上等於數組元素a[3]的“下一個地址”。爲指針ptr賦值的表達式是(int )(&a+1),其含義是將地址強制轉換爲指向int的指針,即指針ptr指向a[3]之後的“下一個元素”。
int (*a)[10]; //定義的是一個數組指針,指向一個有10個int類型元素的整型數組。
int *a[10]; // 定義的是一個指針數組,每個元素爲指向int型的指針。
設有int w[3][4];
且pw
是與數組名w
等價的數組指針,則pw
的初始化語句爲(int (*pw)[4] = w);
給地址0xaae0275c賦值爲1?
1.volatile int *p = (int *)0xaae0275c; *p = 1;
2.volatile int *p = (int *)0xaae0275c; p[0] = 1;
3.*(volatile int *)0xaae0275c = 1;
10.二維數組
數組定義爲 int a[4][5];
引用*(a+1)+2
表示a數組第1行第2列元素的地址。
由於a是二維數組, a:數組名,代表數組的起始地址(常量)
a+1:類型也爲 int (*)[5]
,指向a[1]
。
*(a+1):類型爲int *
,指向一維數組中下標爲 1的行。