C和指針(一)
- 預處理指令
- main 函數
- 常量及變量
- 整型字面值
- 指針:
- 基本聲明:
- 隱式聲明:
- 常量:
預處理指令
預處理器用庫函數頭文件的內容替換掉相對應的#include
指令語句。
使用stdio.h
頭文件可以使我們訪問標準I/O庫中的函數。
另一種預處理指令是#define ,當這個名字以后出現在源文件的任何地方時,它就會被替換為定義的值。
int read_column_numbers ( int columns [ ] , int max );void rearrange ( char *output, char const *input , int n_columns, int const columns[] );
這些聲明稱為函數原型 。它們告訴編譯器這些以后將在源文件中定義的函數的特征,這樣,這些函數被調用時,編譯器就能對它們進行準確性的檢查。每個原型以一個類型名為開頭,表示函數返回值的類型。跟在返回類型后面的是函數的名字, 再后面是函數期望接受的參數。所以,函數read_column_numbers
返回一個整數,接受兩個類型分別是整數數組和整形標量的參數。
rearrange
函數接受4個參數,其中第一個和第二個參數都是指針。指針指定一個存儲于計算機內存中的值的地址。第2個和第4個參數被聲明為const
,這表示函數將不會修改函數調用者所傳遞的這兩個參數。關鍵字void
表示函數并不返回參數,在其他語言里,這種無返回的函數被稱為過程。
main 函數
int main( void )
main是程序執行的起點。
在C語言中,數組參數是以引用形式進行傳遞的,也就是傳址調用,而標量和常量則是按值傳遞的。
所有傳遞給函數的參數都是按值傳遞的。
如今軟件開銷的最大之處并非在于編寫,而是在于維護。
常用printf格式代碼:
格式 | 含義 |
---|---|
%d | 以十進制形式打印一個整型值 |
%o | 以八進制形式打印一個整型值 |
%s | 以十六進制形式打印一個整型值 |
%g | 打印一個浮點值 |
%c | 打印一個字符 |
%s | 打印一個字符串 |
scanf
函數中所有標量參數的前面必須加上一個“&”符號,數組參數前面不需要加上"&"符號,但是數組參數中如果加上了下標引用,也就是說實際參數是數組中某個特定元素,那么它的前面也必須加上“&”符號。
scanf ( "%d", &columns[num] )
常用scanf格式碼:
格式 | 含義 |
---|---|
%d | 讀取一個整型值 int |
%ld | 讀取一個長整型值 long |
%f | 讀取一個實型值(浮點數) float |
%lf | 讀取一個雙精度實型值 double |
%c | 讀取一個字符 char |
%s | 從輸入中讀取一個字符串 char型數組 |
&&
是“邏輯與”操作符,&&操作符兩邊的表達式為真時,整個表達式才為真,如果左邊的表達式為假,右邊的表達式便不再進行求值。
=
賦值操作不是比較操作。
return語句就是函數向調用它的表達式返回一個值。
C語言的for語句:for ( col = 0; col , n_columns; col += 2) {初始部分, 測試部分, 調整部分
執行: 程序必須載入到內存中。執行程序代碼時,將使用一個運行時堆棧(stack),它用于存儲函數的局部變量和返回地址。程序同時可以使用靜態內存,存儲于靜態內存中的變量在程序的整個執行過程中將一直保留它們的值。
基本數據類型:整型家族包括字符、短整型、整型和長整型,分為有符號和無符號。
整型值互相之間的大小規則:長整型至少和整型一樣長,整型至少和短整型一樣長。
格式 | 含義 |
---|---|
char | 0到127 |
signed char | -127到127 |
unsigned char | 0到256 |
short int | -32767到32767 |
unsigned short int | 0到65535 |
int | -32767到32767 |
unsigned int | 0到65535 |
long int | -2147483647到2147483647 |
unsigned long int | 0到4294967295 |
short int 至少16位,long int 至少32位。
常量及變量
整型字面值
字面值 是字面值常量的縮寫,它指定了自身的值,并且不允許發生改變。 命名常量 (聲明為const的變量)與普通變量的區別在于,被初始化后,它的值便不能改變。
在整數字面值后面添加字符L
或l
,使整數被解釋為long整數值
,字符U
或u
則用于把數值指定為unsigned整型值
。如果在一個字面值后面添加UL
,則解釋為unsigned long整型值
。
十六進制以0x開頭,八進制以0開頭。
字符常量 int類型。 是一個用單引號包圍起來的單個字符(或字符轉義序列或三字母詞)如:‘M’ ‘\n’ ‘\377’
浮點數字面值在缺省情況下都是double類型的,除非它的后面跟一個L或l表示是一個long double類型的值,或者跟一個F或f表示它是一個float類型的值。
指針:
變量存儲于計算機的內存中,每個變量都占據一個特定的位置。每個內存位置都由地址唯一確定并引用。
字符串常量是用一對雙引號包圍一串字符,“Hello” “\aWarning!\a” “” 即便是空字符串也存在作為終止符的NUL符號。
基本聲明:
變量聲明的基本形式是: 說明符(一個或多個) 聲明表達式列表
說明符包含了關鍵字,用于描述被聲明的標識符的基本類型。說明符也可以用于改變標識符的缺省存儲類型和作用域。
Int I; char j, l, l;
初始化 是在變量名后跟一個等號(賦值號),后面是想要賦給變量的值。 Int j = 15;
聲明簡單數組 int values[ 20 ] ; 聲明了一個整型數組,數組包含20個整型元素。數組的下標是從0開始的,最后一個元素的下標是元素的數目減1.
聲明指針 int a ; 這條語句表示表達式a產生的結果類型是int。知道了*操作符執行的是間接訪問操作以后,我們可以推斷a是一個指向int的指針。
【 間接訪問操作只對指針變量才是合法的。指針指向結果值。對指針進行間接訪問操作可以獲得這個結果值。】
int* b, c, d; 錯誤 星號實際上是表達式*b的一部分,只對這個標識符有用。b是一個指針,但其余兩個變量只是普通的整型。要聲明三個指針,正確語句如下: int *b, *c, *d;
在聲明指針變量時,你也可以為它指定初始值。Char *message = “Hello world!”; 這條語句把message聲明為一個指向字符的指針,用于字符串常量中第一個字符的地址對該指針進行初始化。 前面一個聲明相當于是:
char *message; message = " Hello world! ";
隱式聲明:
C語言中有幾種聲明,它的類型名可以省略。函數如果不顯式地聲明返回值的類型,它就默認返回整型。
typedef
: 允許為各種數據類型定義新名字。
char *ptr ; 把變量ptr聲明為一個指向字符的指針。 => typedef char *ptr ; 把標識符ptr作為指向字符的指針類型的新名字。 可以在下面的聲明中使用這個新名字ptr a; 聲明a是一個指向字符的指針。
應該使用typedef
而不是#define
來創建新的類型名。因為后者無法正確地處理指針類型。
#define d_ptr_to_char char * d_ptr_to_char a ,b ;
正確地聲明了a ,但是b卻被聲明為一個字符。在定義復雜的類型名字時,如函數指針或指向數組的指針,使用typedef更為合適。
常量:
常量和變量完全一樣,只是它們的值不能被修改。 如: int const a; const int a; 都可以賦值 int const a = 15;