C 語言編程基礎二:重點在指針

int d = 5, result;
float f = 6.382;
result = d * (int) f;
//聲明整型變量並賦值
//聲明單精度浮點型變量並賦值
//將變量強制轉換爲整型再計算

此例的計算結果爲 30, 在運算之初已將變量 f 強制轉換爲整型。假若沒有使用構成符,
表達式 result = d * f 的結果爲 31,因爲變量首先被轉換成單精度浮點型運算,然後賦值時
再被轉爲整型。

C 語言中的簡寫形式

c = c / ( a * b - c % b++ );
c /= a * b - c % b++;
//原表達式
//簡化後的表達式

C 語言的預處理命令
宏替換命令
#define 標識符 字符串

#define MAX(a, b) (a >= b) ? a : b //定義宏替換 MAX(),當 a 大於或等於 b 時
//返回 a 值,否則返回 b
 
int main()
{
int x = 190, y = 106;
printf("MAX: %d", MAX(x, y));
//定義整型變量 x、 y 並賦值
//輸出 x 和 y 中較大的一個,使用宏代換

終止編譯命令
#error 錯誤信息字符串


文件包含命令
#include "filename.h"
#include <stdio.h>
這兩行代碼都使編譯器讀入並編譯頭文件或源代碼文件。雙引號用於包含指定相對路
徑的文件,若未指明相對路徑,則會在當前源文件所在的目錄內檢索。如果文件沒找到,
則檢索標準目錄,不檢索當前工作目錄。尖括號用於包含標準函數庫文件和用戶在編譯指
令裏所指明的函數庫文件,系統會在這些函數庫中搜索指定文件。
 


指針的例子:

#include <stdio.h>
int main(){
    int i,*pi;
    char c[]={97,98,99,100,101};
    char *p;
    p=c;
    printf("%c\n",*p++);
    printf("%c\n",*p++);
    printf("#######\n");
    i=4;
    pi=&i;
    printf("%d\n",*pi++);
    printf("%d\n",(*pi)++);
    printf("%d\n",i);
    return 0;
}

結果如下:

a
b
#######
4
10485312
4


指針與一維數組
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;//定義整型數組 i 和整型指針變量*pi
pi = i; //將指針變量*pi 指向數組 i 的首地址
該賦值操作等同於“ pi = &i[0]”

  • “ pi + n”或“ i + n”表示數組元素 i[n]的地址,即“ & i[n]”。數組 i 有 10 個元素,n 的取值爲 0 至 9,則數組的地址可表示爲“ pi + 0”至“ pi + 9”,或“ i + 1”至“ i + 9”,與&i[0]至&i[9]的作用一樣。
  • 知道了數組元素的地址表示方法,“ *( pi + n)”和“ *(i + n)”就表示爲數組的各元素即等效於 i[n]。
  • 指向數組的指針變量也可用數組的下標形式表示爲 pi[n],其效果相當於“ *(pi +n)”。

指針與二維數組

int i[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *pi;
pi = i[0];
如果要訪問其中的元素i[1][2],則可用公式 1 × n + 2 得到該元素的位置,引用時可寫作“ *( pi + 1 * n + 2)”。

二維數組每一行都有一個首地址,如 i[0]代表&i[0][0]的地址, i[1]代表 i[1][0]的地址。因此,二維數組也可以被看作 m 個長度爲 n 的一維數組,引用二維數組需要將每行的首地址賦給指針變量。

指針與字符串數組
字符型指針變量指向字符串數組首地址後,該指針即可當作字符串使用。

puts()函數的作用是將字符串無格式輸出,當*pc 作爲其參數時,會內存中將*pc 所指向的地址開始,到字符串結束符之間的字符輸出到終端。
如果字符數組中沒有字符串結束符,則調用 printf()或 puts()輸出函數後程序會出錯(一直向後處理,輸出很多意想不到的字符,直到遇到值爲 0 的內存塊)。如果字符型指針變量沒有初始化,可能會造成嚴重影響,如下列源代碼所示。

因爲 pc 的值不可知, pc 可能指向內存中的任意位置。將字符串保存到 pc 所指向的內存單元中,可能造成非常嚴重的系統錯誤。這種用法稱之爲無源指針,在程序中應避免出現。
 



指針的地址分配
GCC 編譯器支持動態分配內存的函數 malloc()和 free(), 它們包含在頭文件 stdlib.h 中。動態內存分配的含義是在程序執行的過程中,動態地劃分內存空間供程序使用。當程序不需要使用這些內存空間,則可以將其釋放。 malloc()函數的作用是向操作系統申請內存, free()函數的作用是釋放所申請的內存。


指 針 數 組
指針數組是一種特殊的數組,這類數組存放的全部是同一數據類型的內存地址。指針數組的定義形式爲:
數據類型 *數組名[長度];

指向常量的指針,必須用 const 定義爲常量指針,以避免修改該指針所指向的數據造成程序錯誤。由於[ ]符號比間接運算符*的優先級要高,所以首先是數組形式 c[4],然後纔是與*結合。這樣,指針數組內包含 4 個指針 c[0]、 c[1]、 c[2]和 c[3],分別指向 4 個字符串的首地址。
 

指向指針的指針
數據類型 **變量名;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章