SlideShare a Scribd company logo
C  入門教學 好景企業股份有限公司
關 於  C (C 語言的格式 ) C 語言編譯過程 原始程式  -->  經由編譯器  -->  變成目的檔  -->  經由連結器  -->  變成執行檔 SOURCE.C --> COMPILER --> SOURCE.OBJ --> LINKER --> SOURCE.EXE C  語 言 的 特 性 可 以 像 組 合 語 言 一 樣 進 行 硬 體 之 直 接 存 取  . 為 語 法 規 則 簡 單  ,  清 楚  ,  容 易 使 用 之 結 構 化 語 言  . 必 要 時 可 以 與 組 合 語 言 連 結  . 可 攜 性  ( Portability )  極 佳  ,  跨 平 台 的 能 力 強  .
關 於  C (C 語言的格式 ) 標 準  C  語 言 格 式  /*Hello World Program*/ #include <stdio.h> int main() {   printf(&quot;Hello, world!\n&quot;); // 第一個 statement   return 0; // 第二個 statement }
基 本 資 料 型 態 變 數 命 名 的 原 則 開 頭 必 須 是 字 母  ( letter )  或 底 線  ( underscore ) . 字 元 的 大 寫 小 寫 所 代 表 的 意 義 不 同  . 不 得 使 用 關 鍵 字  ( keyword ) .
基 本 資 料 型 態 變 數 的 資 料 型 態 種 類 類 別 符號位元 位元長 (bits) 表 示 法 整 數 無 8 unsigned char 16 unsigned short 32 unsigned long 64 unsigned long long 8/16/32 unsigned int 有 8 char 16 short 32 long 字元 N/A 8 char
基 本 資 料 型 態 變 數 的 宣 告 方 法 整 數 部 份  : int a; int b,c=45; short name; long var_name; unsigned int argu1=30; 浮 點 數 部 份  : float a=12.3456;  /* 單精準度 */ float b=0.12345e2; double score=4.987654322e-7;  /* 雙精準度 */ 字 元 部 份  : char c='c'; char bell=7;  /*7 為 ASCII 之響聲字元 */
儲 存 類 別 Scope 自 動 變 數  ( auto variable ) 自 動 變 數 只 在 它 所 定 義 的 區 塊 內 有 效 。 只 要 在 變 數 所 屬 的 區 塊 結 構 內 執 行 , 該 變 數 的 資 料 是 有 效 而 正 確 的 。 當 程 式 執 行 離 開 了 該 區 塊 , 所 有 於 區 塊 內 定 義 的 自 動 變 數 就 不 存 在 了 。 Example 1: main( ) { int x=1;  inner( ); printf(&quot;%d\n&quot;,x); } inner( ) { int x=2; printf(&quot;%d\n&quot;,x); }
儲 存 類 別 Scope 靜 態 變 數  ( static variable) 靜 態 變 數 與 自 動 變 數 一 樣 , 是 某 特 定 函 數 內 的 區 域 性 變 數 , 但靜 態 變 數 的 值 不 會 因 函 數 的 執 行 結 束 而 消 失 。 靜 態 變 數 的 宣 告 如 下 所 示 : { static int a; static int b=12345; static char c; static float d=13.45; . . . }
儲 存 類 別 Scope 外 部 變 數  ( extern variable) 外 部 變 數 和 前 面 所 提 到 的 變 數 不 同 。 外 部 變 數 的 有 效 範 圍 不 是 區 域 性 , 而 是 整 體 性  ( global )  , 外 部 變 數 定 義 在 任 何 函 數 的 外 面 , 表 示 可 以 被 其 他 函 數 所 共 用 。 Example 1: int x=123; main() { printf(&quot;%d\n&quot;,x); }
運 算 子 算 術 運 算 元  ( Arithmetic operators ) 加、減、乘、除、負 數 及 模 數 運 算子 加  ( + ) 、減  ( - ) 、乘  ( * ) 、除  ( / )  為 一 般 的 四 則 運 算 。 而 模 數 運 算  ( % )  是 經 由 兩 常 數 相 除 所 得 的 餘 數 稱 之 。  負 數 是 在 某 個 常 數 前 面 加 個 減 號 所 成 的 組 合 稱 之 。
運 算 子 運 算 子 的 優 先 權 * 、 / 、 % 、 + 、 -  以 上 所 標 示 的 運 算 子 , 其 運 算 的 優 先 順 序 由 左 至 右 。 最好記的方法就是加 () ,括弧。 負號  (-)  高優先順序 乘  ( * ) 、除  ( / ) 、餘數 ( % )  中優先順序 加  ( +) 、減  ( - )  低優先順序
運 算 子 型別之轉換 語法:  (type) expression main( ) { int x1; float y1,y2; x1=(int)4.123; y1=(float)46/5; y2=(int)5.3456; printf(&quot;%d %f %f\n&quot;,x1,y1,y2); }
運 算 子 遞 增 與 遞 減 遞 增 與 遞 減 又 分 為 前 置 模 式  ( prefix )  與 後 置 模 式 ( postfix )  ; 前 置 模 式:是 將  ++  或  - -  置 於 變 數 之 前,其運算是在使用此運算元之前先進行加一或減一之動作。 後 置 模 式: 是 將  ++  或  - -  置 於 變 數 之 後,其運算是在使用此運算元之後才進行加一或減一之動作 。 main() { int a=1,b=1,c=1,d=1; int aplus,bplus; int cminus,dminus; aplus=++a; bplus=b++; cminus=--c; dminus=d--; printf(&quot;%d %d\n&quot;,aplus,bplus); printf(&quot;%d %d\n&quot;,a,b); printf(&quot;%d %d\n&quot;,cminus,dminus); printf(&quot;%d %d\n&quot;,c,d); }
運 算 子 設定特殊運算式 特殊運算式 a += b a -= b a *= b a /= b a %= b 基本運算式 a = a + b a = a - b a = a * b a = a / b a = a % b
運 算 子 邏 輯 運 算 子  ( Logical operators ) 邏 輯 運 算 的 種 類 運算子 功能敘述 運算子 功能敘述 && AND( 及 ) ~ 1' complement( 一的補數 ) || OR( 或 ) << Left shift( 左移 ) ! NOT( 反向 ) >> Right shift
運 算 子 關 係 運 算 子  ( Relational operators ) 一 般 用 於 控 制 流 程 或 有 條 件 的 敘 述 當 中 關 係 運 算 子 運算子 功能敘述 運算子 功能敘述 < 小於 >= 大於等於 <= 小於等於 = = 等於 > 大於 != 不等於
運 算 子 基本運算子優先順序表 !,  負號  (-), ++, -- 乘  ( * ) 、除  ( / ) 、餘數 ( % ) 加  ( +) 、減  ( - ) <, <=, >, >= ==, != && ||
Q & A 休息一下
流 程 控 制 控 制 結 構  ( control structure ) 結 構 化 程 式 設 計 的 基 礎 建 立 在 下 列 三 個 結 構 : 循 序  ( sequential ) :  以 一 個 接 著 一 個 方 式 進 行 作 業 。 條 件 執 行  ( conditional ) : if_then_else  。 迴 路  ( looping ) :
流 程 控 制 條 件 執 行  if  的 運 用 syntax  : if ( 關係運算元 ) { statement 1 ; statement 2 ; . statement n ; } else { statement 1 ; statement 2 ; . statement n ; } 如 果  statement  超 過 一 個 以 上 , 則 須 以  { }  將 其 區 塊 分 隔 開 來 。 Example : void main(void) { char c; scanf(&quot;%c&quot;,&c); if( c == 'A' ) { printf(&quot;c=%c\n&quot;,c); printf(&quot;This is true.\n&quot;); } else { printf(&quot;c!=A\n&quot;); printf(&quot;That isn't true.\n&quot;); } }
流 程 控 制 迴 路  while  的 運 用 在  while  的 敘 述 中 , 當 關 係 運 算 元 之 條 件 為 真 時 , 會 不 斷 地 重 覆 執 行 位 於  while  後 所 列 的 敘 述 , 直 到 條 件 變 為 否 定 才 停 止 。 Example : main( ) { int i=0,c=0; while ( i < 5 ) { printf(&quot;%d&quot;,i++); printf(&quot;%d\n&quot;,++c); } printf(&quot;out of loop.\n&quot;); }
流 程 控 制 迴 路  do-while  的 運 用 do-while  迴 路 , 由 於 測 試 條 件 在 迴 路 的 後 面 , 所 以 迴 路 中 的 敘 述 至 少 會 被 執 行 一 次 。 Example 1:  main( ) { int i=0,c=0; do { printf(&quot;%d&quot;,i++); printf(&quot;%d\n&quot;,++c); } while ( i < 5 ) ; printf(&quot;We're out of the loop.\n&quot;); }
流 程 控 制 迴 路  for  的 運 用 for  允 許 使 用 者 在 同 一 行 敘 述 中 就 設 定 了 迴 路 的 三 個 部 份 。  ( 1 )  計 數 器 的 初 值 ,  ( 2 )  關 係 運 算 元 ,  ( 3 )  增 減 迴 路 計 數 器 的 值 。 Example : main( ) { int i,c; for ( i=0,c=1 ; i < 5 ; ++i,++c ) { printf(&quot;%d&quot;,i); printf(&quot;%d\n&quot;,c); } printf(&quot;Out of Loop.\n&quot;); }
流 程 控 制 條 件 執 行  switch  的 運 用 我 們 在 實 際 的 程 式 寫 作 時 常 會 遇 到 多 種 選 擇 情 況 , 而 使 用 一 連 串  if - else  來 表 示 是 常 發 生 的 , 所 以  C  提 供 了 一 項 特 殊 的 控 制 結 構 , 讓 我 們 能 夠 有 效 且 精 簡 處 理 程 式 。 Example : main( ) { int var=3; switch ( var ) { case 1 : printf(&quot;var = 1\n&quot;); break; case 2 : printf(&quot;var = 2\n&quot;); break;  case 3 : printf(&quot;var = 3\n&quot;); break; default : printf(&quot;I'm in default&quot;); } /* end of switch */ }/*end of main */
流 程 控 制 goto  的 運 用 在 一 個 程 式 中 , 使 用  goto  敘 述 可 以 強 制 改 變 程 式 執 行 的 步 驟 , 但 也 會 因 此 使 程 式 的 結 構 混 亂 , 所 以 此 敘 述 應 儘 量 不 用 。 其 語 法 如 下 所 述 。 Example: main( ) { int i=1111; repeat : printf(&quot;%d\n&quot;,i); goto repeat ; }
函 數 Function 何 謂 函 數  ? C 語言使用的函數可以寫出非常漂亮的程式結構,使程式簡單化,偵錯容易。 將重複之某些指令撰寫成一個函數,可減少編輯程式時間,更可使程式精簡,清晰了解。 C 語言使用的函數其呼叫方法與數學上使用函數完全相同 , 例 如  : a = function ( x , y ) ; 表示將變數  x , y  輸入函數  function ,  其傳回函數值設定給變數  a
函 數 Function 函 數 的 定 義  ( 格式 ) Example: void Line (void) { int j; for (j=1;j<20;j++) printf(“%d\n”,j); }
函 數 Function 函 數 的 儲 存 類 別 static 只能在進行宣告的編譯單位內可以執行 extern 在進行宣告的編譯單位以外也可執行 Example: file2.c extern func1( ); static func3( ) { . . func1( ); . }
函 數 Function 函 數 的 傳 回 值 與 資 料 形 態 要 求 函 數 送 回 傳 回 值  ( 函數值 ) ,  必 須 在 函 數 本 體 中 利 用  return  敘 述 進 行  ,  例 如  : return (  變數或式子  ) ; 此 處 必 須 先 宣 告 傳 回 值  ( 函數值 )  的 資 料 形 態 是 什 麼 。
函 數 Function return() 敘述之目的如下  將控制權傳回給呼叫程式 將 return() 敘述後括號內之數值傳給呼叫程式之方式
函 數 Function      值 的 傳 遞 方 法 傳 遞 變 數 值 本 身  ( Call by value ) Example 1:  傳值呼叫  #include < stdio.h >  int func(int a,b,c) { int d; d=a+b+c; return(d); } void main(void) { int x,y,z,p; x=y=z=3; p=func(x,y,z); printf(&quot;p-->%d\n&quot;,p); } 傳 遞 變 數 的 位 址  ( Call by reference ) #include < stdio.h > void func(int *a,*b,*c,*d) { *d=*a+*b+*c; } void main(void) { int x,y,z,p; x=y=z=3;  func(&x,&y,&z,&p); printf(&quot;p-->%d\n&quot;,p); }
Q & A 休息一下
前 置 處 理 器 Preprocessor 前 置 處 理 器  (preprocessor) 我 們 在 寫 程 式 的 時 候  ,  常 常 會 碰 到 某 些 資 料 重 覆 使 用 或 是 某 些 程 式 片 段 因 特 定 的 條 件 下 須 放 棄  ,  如 果 以 正 常 的 方 式 來 寫 作 程 式  ,  可 能 會 增 加 無 謂 的 程 式 片 段  ,  使 的 程 式 笨 重 不 堪  ,  但 如 果 能 好 好 運 用  C  語 言 所 提 供 的 前 置 處 理 器  ,  則 上 述 的 狀 況 將 改 善 許 多  .  這 個 功 能 並 非  C  語 言 本 身 的 格 式  ,  但 仍 為 編 譯 程 式 所 能 接 受  .  對 前 置 處 理 器 的 解 釋  ,  如 圖 所 示  ,  因 為 它 是 在 程 式 編 譯 之 前 執 行  ,  所 以 顧 名 思 義 稱 之 前 置 處 理  .
前 置 處 理 器 Preprocessor #include (檔 案 的 含 入) #include &quot; 檔案名稱 &quot; :  此表示系統將會到目前的目錄  ( 路徑  )  下尋找所指定的檔案  , 如果找不到  , 則會去系統設定的目錄底下尋找 #include < 檔案名稱 > :  此表示系統將會到系統設定的目錄底下尋找所指定的檔案  .
前 置 處 理 器 Preprocessor #define (字 串 的 置 換  /  巨 集 定 義)與  #undef <1>  巨 集  #define  的 使 用  : 其 主 要 之 功 能 是 以 簡 單 的 名 稱 取 代 某 些 特 定 的 常 數 或 字 串  ,  函 數  ,  建 立 更 簡 單 更 易 懂 的 程 式  .  語 法 如 下  : #define  巨集名稱 常數或函式或字串 <2>  巨 集  #undef  的 使 用  : 其 主 要 之 功 能 則 是 取 消 最 接 近 之  #define  所 定 義 的 敘 述  . #undef  巨集名稱
前 置 處 理 器 Preprocessor Example1: #include < stdio.h > #define PI 3.14159 main() { printf(&quot;PI=%2.5f&quot;,PI); } Example2 : #include < stdio.h > #define add(a,b) a+b void main(void) { int i,j,k; i=2; j=3; k=add(i,j); printf(&quot;i+j=%d\n&quot;,k); }
前 置 處 理 器 Preprocessor 條 件 式 的 編 譯 條 件 式 的 編 譯 ,  此 用 法 的 最 大 特 色 在 於 其 敘 述 不 僅 可 以 放 在 程 式 的 頂 端  ,  亦 可 將 其 敘 述 放 置 於 程 式 中  .  以 下 所 列  (1) ,(2) ,(3)  項 為 條 件 式 編 譯 的 成 員  . (1) #if , #endif (2) #else / #elif (3) #ifdef , #ifndef
前 置 處 理 器 Preprocessor 由 以 上 的 敘 述  ,  我 們 不 難 發 現 這 些 條 件 式 編 譯 的 成 員 與 前 幾 章 控 制 流 程 所 提 到  if ... then ... else  的 語 法 十 分 相 似  ,  且 連 使 用 方 法 與 原 理 都 非 常 相 似  . Example1: #include < stdio.h > #define value  99 void main(void) { #if value < 100 printf(&quot;value < 100&quot;); #else printf(&quot;value >= 100&quot;); #endif }
結 構 Struct  與 組 合 Union 結 構  (Structure) 在 C 語言中 , 結構的宣告方式如下  : struct  結構名稱標籤  {  資料型態  資料變數元素 1; 資料型態  資料變數元素 2;  ‧‧‧‧‧‧‧‧ }; For example  struct Personal  {  char Name; int Hour; int Minute; }
結 構 Struct  與 組 合 Union 結 構  的 使 用
結 構 Struct  與 組 合 Union 聯集  (Union) 聯集之形式與結構非常類似。在 C 語言中 ,  聯集之宣告方式如下  : union  聯集名稱標籤  {  資料型態  資料變數元素 1; 資料型態  資料變數元素 2; ‧‧‧‧‧‧‧‧  }; Example: union unit { char ch; int num; float fl; }  object; object.ch = ‘a’; object.num = 100; object.fl = 3.41;
結 構 Struct  與 組 合 Union 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁有之空間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種型態存在。上例中,聯集 object 不可能擁有字元 ’ a’  與整數 100;  它僅佔有 4  個  Bytes  ,因為成員中 float 型態所佔有空間最大。
Q & A 休息一下
陣 列 Array  與 指 標 Pointer 何謂陣列  ( Array) 有限個相同資料型態之元素組成之集合 一大塊連續之記憶體 一組索引與資料對映
陣 列 Array  與 指 標 Pointer 一 維 陣 列 一 維 陣 列 的 宣 告 方 式 如 下 所 述  : 陣列的資料型態  陣列的名稱  [  陣列的大小  ] ; int  array1 [ 20 ] ; float  array2 [ 25 ] ; char  array3 [ 50 ] ;
陣 列 Array  與 指 標 Pointer 陣 列 與 基 本 輸 出  /  輸 入 函 數 的 搭 配 無 論 是 整 數  ,  浮 點 數 或 字 元 陣 列  ( 字串  )  均 可 與 基 本 輸 出  /  輸 入 函 數 的 搭 配  .  例 如 一 名 叫  array1  的 字 元 陣 列  : printf(&quot;%s\n&quot;,array1);  puts(array1); scanf(&quot;%s&quot;,array1); gets(array1); 所 以  USER  可 以 自 行 參 考 相 關 的 章 節 使 用 之  .  在 此 補 充 一 點  ,  上 述 所 敘 述  scanf  函 數 是 乎 少 一 個  & ( 位址運算元  ) ? ? ?  沒 錯  !  那 是 因 為陣 列 本 身 的 名 稱 即 代 表 其 位 址 之 所 在  ,  所 以 不 需 在 陣 列 名 稱 前 加 上  &  符 號 來 代 表 位 址  .
陣 列 Array  與 指 標 Pointer 指 標  ( Pointer ) 何 謂 指 標 呢  ?  簡 單 的 說  &quot;  它 是 一 個 用 來 指 示 資 料 存 在 於 記 憶 體 中 的 位 址 標 示 器  &quot; ,  簡 稱 指 標  .  由 指 標 的 運 用 裡  ,  使 我 們 瞭 解 到 資 料 與 位 址 間 的 關 係  ,  進 而 對 記 憶 體 配 置 有 很 大 的 幫 助  .
陣 列 Array  與 指 標 Pointer 指 標 的 基 本 觀 念 在  C  語 言 中  ,  指 標 變 數 的 宣 告 方 式 如 下  : 變數資料型態  * 變數名稱  ; For example  int  *ptr ; 由 以 上 的 宣 告  ,  表 示 了 三 件 事 : ptr  為 指 標 變 數 ,  ptr  代 表 一 個 位 址  *ptr  代 表 此 位 址 內 的 資 料  ptr  所 指 向 此 位 址 之 變 數 型 態 為 整 數  ( int )
陣 列 Array  與 指 標 Pointer 指 標 變 數 宣 告 的 關 鍵 字 為  &quot; * &quot; ,  而 指 標 變 數 的 資 料 型 態 也 分 為 整 數  ( int ) ,  浮 點 數  ( float ) ,  字 元  ( char )  三 種  . &quot;&&quot;  為另一重要符號, &quot;&&quot; 為一個特殊運算子,目的為傳回運算元之位址 為什麼 scanf()  中之所有引數變數一定要加上 &quot;&&quot; 符號 ???………. Example: #include < stdio.h > void main(void) { int x=10; int *y; y=&x; printf(&quot; x = %d\n&quot;, x); printf(&quot;&x = %x\n&quot;,&x); printf(&quot;*y = %d\n&quot;,*y); printf(&quot; y = %x\n&quot;, y); } 執行結果  :  x = 10 &x = ffda *y = 10 y = ffda
陣 列 Array  與 指 標 Pointer 指 標 與 函 數 間 的 關 係 關 於 函 數 呼 叫 的 方 式 中  , Call by value  的 引 數 傳 遞 方 式  ,  被 呼 叫 函 數 不 能 直 接 更 改 呼 叫 函 數 中 的 變 數  ,  但 如 果 是 以 指 標 當 作 函 數 的 引 數  ( Call by reference ) ,  則 上 述 的 狀 況 均 迎 刃 而 解  ,  而 且 也 不 受 函 數 返 回 值  ( return )  只 能 有 一 個 的 影 響  . Example: #include < stdio.h > change(int *x,*y) { int temp; temp=*x; *x=*y; *y=temp; } void main(void) { int m=3,n=4; printf(&quot; m = %d  n= %d \n\n&quot;,m,n); change(&m,&n); printf(&quot; m = %d  n= %d \n&quot;,m,n); } 執行結果  : m = 3  n= 4 m = 4  n= 3
陣 列 Array  與 指 標 Pointer 指 標 與 陣 列 的 關 係 我 們 可 以 將 指 標 與 陣 列 的 關 係 來 做 一 對 比  .  例 如  :  有 一 整 數 陣 列 名 為  array ,  其 陣 列 大 小 為 五 個  ,  其 內 容 分 別 是  1,2,3,4,5 . For example:  int array[5]={ 1,2,3,4,5 }; array[0]=1 <--> *(array+0)=1 array[1]=2 <--> *(array+1)=2 array[2]=3 <--> *(array+2)=3 array[3]=4 <--> *(array+3)=4 array[4]=5 <--> *(array+4)=5
陣 列 Array  與 指 標 Pointer 指 標 與 字 元 陣 列  (  字 串  )  間 的 關 係 string[0]=P <--> *(string+0)=P string[1]=O <--> *(string+1)=O string[2]=I <--> *(string+2)=I string[3]=N <--> *(string+3)=N string[4]=T <--> *(string+4)=T string[5]=E <--> *(string+5)=E string[6]=R <--> *(string+6)=R
陣 列 Array  與 指 標 Pointer 指 標 與 陣 列 的 混 合 應 用 指標之運算有兩種:  (+)  、  (-)  假設指標 ptr 所指資料為整數,且其為指為 1666 指令  執行結果  執行動作 ptr++  1668 指向下一個整數位址 ptr-- 1664 指向前一個整數位址 ptr+7 1674 指向第七個整數位址
Q & A 發問時間

More Related Content

PPT
第六章 函數與巨集
PPT
第4章函数
PPT
第3章算法与控制语句
PPT
C語言 第4章 基本輸出與輸入功能
PPTX
認識 C++11 新標準及使用 AMP 函式庫作平行運算
PPT
Introduction to C++ over CLI
PDF
Python基本資料運算
PPT
10 檔案說明與處理
第六章 函數與巨集
第4章函数
第3章算法与控制语句
C語言 第4章 基本輸出與輸入功能
認識 C++11 新標準及使用 AMP 函式庫作平行運算
Introduction to C++ over CLI
Python基本資料運算
10 檔案說明與處理

What's hot (20)

PPT
Ch07
PDF
Python 迴圈作業
PDF
Python分支作業
PPT
07 陣列與字串
PPT
C語言 第三章 03 運算子、運算元與運算式
PPT
C語言 第五章 程式流程控制
PDF
Python變數與資料運算
PPT
Ch08
PPT
C語言 第一章 C語言簡介
PPT
C語言 第二章 02 C的資料處理
PPTX
Intro to C++ Basic
PPT
第6章指针
PDF
Ch 8
PDF
OOP in C - Virtual Function (Chinese Version)
PDF
建置Python開發環境
PDF
Python程式設計 - 分支作業
PPT
Ch10
DOCX
系統程式 -- 第 8 章 編譯器
DOCX
系統程式 -- 第 7 章 高階語言
PDF
系統程式 -- 第 3 章
Ch07
Python 迴圈作業
Python分支作業
07 陣列與字串
C語言 第三章 03 運算子、運算元與運算式
C語言 第五章 程式流程控制
Python變數與資料運算
Ch08
C語言 第一章 C語言簡介
C語言 第二章 02 C的資料處理
Intro to C++ Basic
第6章指针
Ch 8
OOP in C - Virtual Function (Chinese Version)
建置Python開發環境
Python程式設計 - 分支作業
Ch10
系統程式 -- 第 8 章 編譯器
系統程式 -- 第 7 章 高階語言
系統程式 -- 第 3 章
Ad

Similar to 1 C入門教學 (20)

PPT
C程式-函式與巨集
PPT
06 函數與巨集
PDF
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
PPTX
Chapter 3 basic syntax and operator
PPT
PPT
PPT
PPT
PPTX
Chapter 6 point (c)
PPTX
PDF
C語言應用前置處理
PPT
Ch03
PPT
Ch05
PDF
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(一)
PDF
Programming python - part 1
PDF
張逸 - 研究所 / 轉學考計算機概論 、公職計算機概要 - 程式語言 - 試閱版
PPT
第六章 函數與巨集
PPT
第六章 函數與巨集
PPT
第六章 函數與巨集
C程式-函式與巨集
06 函數與巨集
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(二)
Chapter 3 basic syntax and operator
Chapter 6 point (c)
C語言應用前置處理
Ch03
Ch05
看似比較簡單的推坑教學 C語言從崩潰到崩潰Ex(一)
Programming python - part 1
張逸 - 研究所 / 轉學考計算機概論 、公職計算機概要 - 程式語言 - 試閱版
第六章 函數與巨集
第六章 函數與巨集
第六章 函數與巨集
Ad

Recently uploaded (20)

DOCX
銀髮人才重返職場的心態調整與價值提升 銀髮再就業講座 掌握銀髮人才關鍵漸進式退休的運用-銀髮勞動力論壇 詹翔霖教授
PPTX
A Digital Transformation Methodology.pptx
PPTX
学校原版伦敦城市大学毕业证London Met毕业证原版一比一
PPTX
学校原版佐治亚大学毕业证UGA毕业证原版一比一
PPTX
学校原版剑桥大学毕业证Cantab毕业证原版一比一
PPTX
3分钟读懂南威尔士大学毕业证UCB毕业证学历认证
PPTX
学校原版中央兰开夏大学毕业证UCLan毕业证原版一比一
PPTX
3分钟读懂皇家艺术学院毕业证RCA毕业证学历认证
PPTX
3分钟读懂拉夫堡大学毕业证LU毕业证学历认证
PPTX
学校原版布鲁内尔大学毕业证Brunel毕业证原版一比一
PPTX
3分钟读懂曼彻斯特大学毕业证UoM毕业证学历认证
PPTX
学校原版弗吉尼亚大学毕业证UVA毕业证原版一比一
PPTX
3分钟读懂纽曼大学毕业证Newman毕业证学历认证
PPTX
学校原版杜克大学毕业证Duke毕业证原版一比一
PPTX
3分钟读懂渥太华大学毕业证UO毕业证学历认证
PPTX
学校原版肯塔基大学毕业证UK毕业证原版一比一
PPTX
学校原版汤普森河大学毕业证TRU毕业证原版一比一
PPTX
3分钟读懂贝尔法斯特女王大学毕业证QUB毕业证学历认证
PPTX
学校原版迈阿密大学毕业证UMiami毕业证原版一比一
PPTX
3分钟读懂渥太华大学毕业证uOttawa毕业证学历认证
銀髮人才重返職場的心態調整與價值提升 銀髮再就業講座 掌握銀髮人才關鍵漸進式退休的運用-銀髮勞動力論壇 詹翔霖教授
A Digital Transformation Methodology.pptx
学校原版伦敦城市大学毕业证London Met毕业证原版一比一
学校原版佐治亚大学毕业证UGA毕业证原版一比一
学校原版剑桥大学毕业证Cantab毕业证原版一比一
3分钟读懂南威尔士大学毕业证UCB毕业证学历认证
学校原版中央兰开夏大学毕业证UCLan毕业证原版一比一
3分钟读懂皇家艺术学院毕业证RCA毕业证学历认证
3分钟读懂拉夫堡大学毕业证LU毕业证学历认证
学校原版布鲁内尔大学毕业证Brunel毕业证原版一比一
3分钟读懂曼彻斯特大学毕业证UoM毕业证学历认证
学校原版弗吉尼亚大学毕业证UVA毕业证原版一比一
3分钟读懂纽曼大学毕业证Newman毕业证学历认证
学校原版杜克大学毕业证Duke毕业证原版一比一
3分钟读懂渥太华大学毕业证UO毕业证学历认证
学校原版肯塔基大学毕业证UK毕业证原版一比一
学校原版汤普森河大学毕业证TRU毕业证原版一比一
3分钟读懂贝尔法斯特女王大学毕业证QUB毕业证学历认证
学校原版迈阿密大学毕业证UMiami毕业证原版一比一
3分钟读懂渥太华大学毕业证uOttawa毕业证学历认证

1 C入門教學

  • 1. C 入門教學 好景企業股份有限公司
  • 2. 關 於 C (C 語言的格式 ) C 語言編譯過程 原始程式 --> 經由編譯器 --> 變成目的檔 --> 經由連結器 --> 變成執行檔 SOURCE.C --> COMPILER --> SOURCE.OBJ --> LINKER --> SOURCE.EXE C 語 言 的 特 性 可 以 像 組 合 語 言 一 樣 進 行 硬 體 之 直 接 存 取 . 為 語 法 規 則 簡 單 , 清 楚 , 容 易 使 用 之 結 構 化 語 言 . 必 要 時 可 以 與 組 合 語 言 連 結 . 可 攜 性 ( Portability ) 極 佳 , 跨 平 台 的 能 力 強 .
  • 3. 關 於 C (C 語言的格式 ) 標 準 C 語 言 格 式 /*Hello World Program*/ #include <stdio.h> int main() {   printf(&quot;Hello, world!\n&quot;); // 第一個 statement   return 0; // 第二個 statement }
  • 4. 基 本 資 料 型 態 變 數 命 名 的 原 則 開 頭 必 須 是 字 母 ( letter ) 或 底 線 ( underscore ) . 字 元 的 大 寫 小 寫 所 代 表 的 意 義 不 同 . 不 得 使 用 關 鍵 字 ( keyword ) .
  • 5. 基 本 資 料 型 態 變 數 的 資 料 型 態 種 類 類 別 符號位元 位元長 (bits) 表 示 法 整 數 無 8 unsigned char 16 unsigned short 32 unsigned long 64 unsigned long long 8/16/32 unsigned int 有 8 char 16 short 32 long 字元 N/A 8 char
  • 6. 基 本 資 料 型 態 變 數 的 宣 告 方 法 整 數 部 份 : int a; int b,c=45; short name; long var_name; unsigned int argu1=30; 浮 點 數 部 份 : float a=12.3456; /* 單精準度 */ float b=0.12345e2; double score=4.987654322e-7; /* 雙精準度 */ 字 元 部 份 : char c='c'; char bell=7; /*7 為 ASCII 之響聲字元 */
  • 7. 儲 存 類 別 Scope 自 動 變 數 ( auto variable ) 自 動 變 數 只 在 它 所 定 義 的 區 塊 內 有 效 。 只 要 在 變 數 所 屬 的 區 塊 結 構 內 執 行 , 該 變 數 的 資 料 是 有 效 而 正 確 的 。 當 程 式 執 行 離 開 了 該 區 塊 , 所 有 於 區 塊 內 定 義 的 自 動 變 數 就 不 存 在 了 。 Example 1: main( ) { int x=1; inner( ); printf(&quot;%d\n&quot;,x); } inner( ) { int x=2; printf(&quot;%d\n&quot;,x); }
  • 8. 儲 存 類 別 Scope 靜 態 變 數 ( static variable) 靜 態 變 數 與 自 動 變 數 一 樣 , 是 某 特 定 函 數 內 的 區 域 性 變 數 , 但靜 態 變 數 的 值 不 會 因 函 數 的 執 行 結 束 而 消 失 。 靜 態 變 數 的 宣 告 如 下 所 示 : { static int a; static int b=12345; static char c; static float d=13.45; . . . }
  • 9. 儲 存 類 別 Scope 外 部 變 數 ( extern variable) 外 部 變 數 和 前 面 所 提 到 的 變 數 不 同 。 外 部 變 數 的 有 效 範 圍 不 是 區 域 性 , 而 是 整 體 性 ( global ) , 外 部 變 數 定 義 在 任 何 函 數 的 外 面 , 表 示 可 以 被 其 他 函 數 所 共 用 。 Example 1: int x=123; main() { printf(&quot;%d\n&quot;,x); }
  • 10. 運 算 子 算 術 運 算 元 ( Arithmetic operators ) 加、減、乘、除、負 數 及 模 數 運 算子 加 ( + ) 、減 ( - ) 、乘 ( * ) 、除 ( / ) 為 一 般 的 四 則 運 算 。 而 模 數 運 算 ( % ) 是 經 由 兩 常 數 相 除 所 得 的 餘 數 稱 之 。 負 數 是 在 某 個 常 數 前 面 加 個 減 號 所 成 的 組 合 稱 之 。
  • 11. 運 算 子 運 算 子 的 優 先 權 * 、 / 、 % 、 + 、 - 以 上 所 標 示 的 運 算 子 , 其 運 算 的 優 先 順 序 由 左 至 右 。 最好記的方法就是加 () ,括弧。 負號 (-) 高優先順序 乘 ( * ) 、除 ( / ) 、餘數 ( % ) 中優先順序 加 ( +) 、減 ( - ) 低優先順序
  • 12. 運 算 子 型別之轉換 語法: (type) expression main( ) { int x1; float y1,y2; x1=(int)4.123; y1=(float)46/5; y2=(int)5.3456; printf(&quot;%d %f %f\n&quot;,x1,y1,y2); }
  • 13. 運 算 子 遞 增 與 遞 減 遞 增 與 遞 減 又 分 為 前 置 模 式 ( prefix ) 與 後 置 模 式 ( postfix ) ; 前 置 模 式:是 將 ++ 或 - - 置 於 變 數 之 前,其運算是在使用此運算元之前先進行加一或減一之動作。 後 置 模 式: 是 將 ++ 或 - - 置 於 變 數 之 後,其運算是在使用此運算元之後才進行加一或減一之動作 。 main() { int a=1,b=1,c=1,d=1; int aplus,bplus; int cminus,dminus; aplus=++a; bplus=b++; cminus=--c; dminus=d--; printf(&quot;%d %d\n&quot;,aplus,bplus); printf(&quot;%d %d\n&quot;,a,b); printf(&quot;%d %d\n&quot;,cminus,dminus); printf(&quot;%d %d\n&quot;,c,d); }
  • 14. 運 算 子 設定特殊運算式 特殊運算式 a += b a -= b a *= b a /= b a %= b 基本運算式 a = a + b a = a - b a = a * b a = a / b a = a % b
  • 15. 運 算 子 邏 輯 運 算 子 ( Logical operators ) 邏 輯 運 算 的 種 類 運算子 功能敘述 運算子 功能敘述 && AND( 及 ) ~ 1' complement( 一的補數 ) || OR( 或 ) << Left shift( 左移 ) ! NOT( 反向 ) >> Right shift
  • 16. 運 算 子 關 係 運 算 子 ( Relational operators ) 一 般 用 於 控 制 流 程 或 有 條 件 的 敘 述 當 中 關 係 運 算 子 運算子 功能敘述 運算子 功能敘述 < 小於 >= 大於等於 <= 小於等於 = = 等於 > 大於 != 不等於
  • 17. 運 算 子 基本運算子優先順序表 !, 負號 (-), ++, -- 乘 ( * ) 、除 ( / ) 、餘數 ( % ) 加 ( +) 、減 ( - ) <, <=, >, >= ==, != && ||
  • 18. Q & A 休息一下
  • 19. 流 程 控 制 控 制 結 構 ( control structure ) 結 構 化 程 式 設 計 的 基 礎 建 立 在 下 列 三 個 結 構 : 循 序 ( sequential ) : 以 一 個 接 著 一 個 方 式 進 行 作 業 。 條 件 執 行 ( conditional ) : if_then_else 。 迴 路 ( looping ) :
  • 20. 流 程 控 制 條 件 執 行 if 的 運 用 syntax : if ( 關係運算元 ) { statement 1 ; statement 2 ; . statement n ; } else { statement 1 ; statement 2 ; . statement n ; } 如 果 statement 超 過 一 個 以 上 , 則 須 以 { } 將 其 區 塊 分 隔 開 來 。 Example : void main(void) { char c; scanf(&quot;%c&quot;,&c); if( c == 'A' ) { printf(&quot;c=%c\n&quot;,c); printf(&quot;This is true.\n&quot;); } else { printf(&quot;c!=A\n&quot;); printf(&quot;That isn't true.\n&quot;); } }
  • 21. 流 程 控 制 迴 路 while 的 運 用 在 while 的 敘 述 中 , 當 關 係 運 算 元 之 條 件 為 真 時 , 會 不 斷 地 重 覆 執 行 位 於 while 後 所 列 的 敘 述 , 直 到 條 件 變 為 否 定 才 停 止 。 Example : main( ) { int i=0,c=0; while ( i < 5 ) { printf(&quot;%d&quot;,i++); printf(&quot;%d\n&quot;,++c); } printf(&quot;out of loop.\n&quot;); }
  • 22. 流 程 控 制 迴 路 do-while 的 運 用 do-while 迴 路 , 由 於 測 試 條 件 在 迴 路 的 後 面 , 所 以 迴 路 中 的 敘 述 至 少 會 被 執 行 一 次 。 Example 1: main( ) { int i=0,c=0; do { printf(&quot;%d&quot;,i++); printf(&quot;%d\n&quot;,++c); } while ( i < 5 ) ; printf(&quot;We're out of the loop.\n&quot;); }
  • 23. 流 程 控 制 迴 路 for 的 運 用 for 允 許 使 用 者 在 同 一 行 敘 述 中 就 設 定 了 迴 路 的 三 個 部 份 。 ( 1 ) 計 數 器 的 初 值 , ( 2 ) 關 係 運 算 元 , ( 3 ) 增 減 迴 路 計 數 器 的 值 。 Example : main( ) { int i,c; for ( i=0,c=1 ; i < 5 ; ++i,++c ) { printf(&quot;%d&quot;,i); printf(&quot;%d\n&quot;,c); } printf(&quot;Out of Loop.\n&quot;); }
  • 24. 流 程 控 制 條 件 執 行 switch 的 運 用 我 們 在 實 際 的 程 式 寫 作 時 常 會 遇 到 多 種 選 擇 情 況 , 而 使 用 一 連 串 if - else 來 表 示 是 常 發 生 的 , 所 以 C 提 供 了 一 項 特 殊 的 控 制 結 構 , 讓 我 們 能 夠 有 效 且 精 簡 處 理 程 式 。 Example : main( ) { int var=3; switch ( var ) { case 1 : printf(&quot;var = 1\n&quot;); break; case 2 : printf(&quot;var = 2\n&quot;); break; case 3 : printf(&quot;var = 3\n&quot;); break; default : printf(&quot;I'm in default&quot;); } /* end of switch */ }/*end of main */
  • 25. 流 程 控 制 goto 的 運 用 在 一 個 程 式 中 , 使 用 goto 敘 述 可 以 強 制 改 變 程 式 執 行 的 步 驟 , 但 也 會 因 此 使 程 式 的 結 構 混 亂 , 所 以 此 敘 述 應 儘 量 不 用 。 其 語 法 如 下 所 述 。 Example: main( ) { int i=1111; repeat : printf(&quot;%d\n&quot;,i); goto repeat ; }
  • 26. 函 數 Function 何 謂 函 數 ? C 語言使用的函數可以寫出非常漂亮的程式結構,使程式簡單化,偵錯容易。 將重複之某些指令撰寫成一個函數,可減少編輯程式時間,更可使程式精簡,清晰了解。 C 語言使用的函數其呼叫方法與數學上使用函數完全相同 , 例 如 : a = function ( x , y ) ; 表示將變數 x , y 輸入函數 function , 其傳回函數值設定給變數 a
  • 27. 函 數 Function 函 數 的 定 義 ( 格式 ) Example: void Line (void) { int j; for (j=1;j<20;j++) printf(“%d\n”,j); }
  • 28. 函 數 Function 函 數 的 儲 存 類 別 static 只能在進行宣告的編譯單位內可以執行 extern 在進行宣告的編譯單位以外也可執行 Example: file2.c extern func1( ); static func3( ) { . . func1( ); . }
  • 29. 函 數 Function 函 數 的 傳 回 值 與 資 料 形 態 要 求 函 數 送 回 傳 回 值 ( 函數值 ) , 必 須 在 函 數 本 體 中 利 用 return 敘 述 進 行 , 例 如 : return ( 變數或式子 ) ; 此 處 必 須 先 宣 告 傳 回 值 ( 函數值 ) 的 資 料 形 態 是 什 麼 。
  • 30. 函 數 Function return() 敘述之目的如下 將控制權傳回給呼叫程式 將 return() 敘述後括號內之數值傳給呼叫程式之方式
  • 31. 函 數 Function      值 的 傳 遞 方 法 傳 遞 變 數 值 本 身 ( Call by value ) Example 1: 傳值呼叫 #include < stdio.h > int func(int a,b,c) { int d; d=a+b+c; return(d); } void main(void) { int x,y,z,p; x=y=z=3; p=func(x,y,z); printf(&quot;p-->%d\n&quot;,p); } 傳 遞 變 數 的 位 址 ( Call by reference ) #include < stdio.h > void func(int *a,*b,*c,*d) { *d=*a+*b+*c; } void main(void) { int x,y,z,p; x=y=z=3; func(&x,&y,&z,&p); printf(&quot;p-->%d\n&quot;,p); }
  • 32. Q & A 休息一下
  • 33. 前 置 處 理 器 Preprocessor 前 置 處 理 器 (preprocessor) 我 們 在 寫 程 式 的 時 候 , 常 常 會 碰 到 某 些 資 料 重 覆 使 用 或 是 某 些 程 式 片 段 因 特 定 的 條 件 下 須 放 棄 , 如 果 以 正 常 的 方 式 來 寫 作 程 式 , 可 能 會 增 加 無 謂 的 程 式 片 段 , 使 的 程 式 笨 重 不 堪 , 但 如 果 能 好 好 運 用 C 語 言 所 提 供 的 前 置 處 理 器 , 則 上 述 的 狀 況 將 改 善 許 多 . 這 個 功 能 並 非 C 語 言 本 身 的 格 式 , 但 仍 為 編 譯 程 式 所 能 接 受 . 對 前 置 處 理 器 的 解 釋 , 如 圖 所 示 , 因 為 它 是 在 程 式 編 譯 之 前 執 行 , 所 以 顧 名 思 義 稱 之 前 置 處 理 .
  • 34. 前 置 處 理 器 Preprocessor #include (檔 案 的 含 入) #include &quot; 檔案名稱 &quot; : 此表示系統將會到目前的目錄 ( 路徑 ) 下尋找所指定的檔案 , 如果找不到 , 則會去系統設定的目錄底下尋找 #include < 檔案名稱 > : 此表示系統將會到系統設定的目錄底下尋找所指定的檔案 .
  • 35. 前 置 處 理 器 Preprocessor #define (字 串 的 置 換 / 巨 集 定 義)與 #undef <1> 巨 集 #define 的 使 用 : 其 主 要 之 功 能 是 以 簡 單 的 名 稱 取 代 某 些 特 定 的 常 數 或 字 串 , 函 數 , 建 立 更 簡 單 更 易 懂 的 程 式 . 語 法 如 下 : #define 巨集名稱 常數或函式或字串 <2> 巨 集 #undef 的 使 用 : 其 主 要 之 功 能 則 是 取 消 最 接 近 之 #define 所 定 義 的 敘 述 . #undef 巨集名稱
  • 36. 前 置 處 理 器 Preprocessor Example1: #include < stdio.h > #define PI 3.14159 main() { printf(&quot;PI=%2.5f&quot;,PI); } Example2 : #include < stdio.h > #define add(a,b) a+b void main(void) { int i,j,k; i=2; j=3; k=add(i,j); printf(&quot;i+j=%d\n&quot;,k); }
  • 37. 前 置 處 理 器 Preprocessor 條 件 式 的 編 譯 條 件 式 的 編 譯 , 此 用 法 的 最 大 特 色 在 於 其 敘 述 不 僅 可 以 放 在 程 式 的 頂 端 , 亦 可 將 其 敘 述 放 置 於 程 式 中 . 以 下 所 列 (1) ,(2) ,(3) 項 為 條 件 式 編 譯 的 成 員 . (1) #if , #endif (2) #else / #elif (3) #ifdef , #ifndef
  • 38. 前 置 處 理 器 Preprocessor 由 以 上 的 敘 述 , 我 們 不 難 發 現 這 些 條 件 式 編 譯 的 成 員 與 前 幾 章 控 制 流 程 所 提 到 if ... then ... else 的 語 法 十 分 相 似 , 且 連 使 用 方 法 與 原 理 都 非 常 相 似 . Example1: #include < stdio.h > #define value 99 void main(void) { #if value < 100 printf(&quot;value < 100&quot;); #else printf(&quot;value >= 100&quot;); #endif }
  • 39. 結 構 Struct 與 組 合 Union 結 構 (Structure) 在 C 語言中 , 結構的宣告方式如下 : struct 結構名稱標籤 { 資料型態 資料變數元素 1; 資料型態 資料變數元素 2; ‧‧‧‧‧‧‧‧ }; For example struct Personal { char Name; int Hour; int Minute; }
  • 40. 結 構 Struct 與 組 合 Union 結 構  的 使 用
  • 41. 結 構 Struct 與 組 合 Union 聯集 (Union) 聯集之形式與結構非常類似。在 C 語言中 , 聯集之宣告方式如下 : union 聯集名稱標籤 { 資料型態 資料變數元素 1; 資料型態 資料變數元素 2; ‧‧‧‧‧‧‧‧ }; Example: union unit { char ch; int num; float fl; } object; object.ch = ‘a’; object.num = 100; object.fl = 3.41;
  • 42. 結 構 Struct 與 組 合 Union 聯集與結構之不同處在於聯集所佔之空間為所有成員中最大物件擁有之空間。也就是說,聯集中所有成員,再同一瞬間,僅能有一種型態存在。上例中,聯集 object 不可能擁有字元 ’ a’ 與整數 100; 它僅佔有 4 個 Bytes ,因為成員中 float 型態所佔有空間最大。
  • 43. Q & A 休息一下
  • 44. 陣 列 Array 與 指 標 Pointer 何謂陣列 ( Array) 有限個相同資料型態之元素組成之集合 一大塊連續之記憶體 一組索引與資料對映
  • 45. 陣 列 Array 與 指 標 Pointer 一 維 陣 列 一 維 陣 列 的 宣 告 方 式 如 下 所 述 : 陣列的資料型態 陣列的名稱 [ 陣列的大小 ] ; int array1 [ 20 ] ; float array2 [ 25 ] ; char array3 [ 50 ] ;
  • 46. 陣 列 Array 與 指 標 Pointer 陣 列 與 基 本 輸 出 / 輸 入 函 數 的 搭 配 無 論 是 整 數 , 浮 點 數 或 字 元 陣 列 ( 字串 ) 均 可 與 基 本 輸 出 / 輸 入 函 數 的 搭 配 . 例 如 一 名 叫 array1 的 字 元 陣 列 : printf(&quot;%s\n&quot;,array1); puts(array1); scanf(&quot;%s&quot;,array1); gets(array1); 所 以 USER 可 以 自 行 參 考 相 關 的 章 節 使 用 之 . 在 此 補 充 一 點 , 上 述 所 敘 述 scanf 函 數 是 乎 少 一 個 & ( 位址運算元 ) ? ? ? 沒 錯 ! 那 是 因 為陣 列 本 身 的 名 稱 即 代 表 其 位 址 之 所 在 , 所 以 不 需 在 陣 列 名 稱 前 加 上 & 符 號 來 代 表 位 址 .
  • 47. 陣 列 Array 與 指 標 Pointer 指 標 ( Pointer ) 何 謂 指 標 呢 ? 簡 單 的 說 &quot; 它 是 一 個 用 來 指 示 資 料 存 在 於 記 憶 體 中 的 位 址 標 示 器 &quot; , 簡 稱 指 標 . 由 指 標 的 運 用 裡 , 使 我 們 瞭 解 到 資 料 與 位 址 間 的 關 係 , 進 而 對 記 憶 體 配 置 有 很 大 的 幫 助 .
  • 48. 陣 列 Array 與 指 標 Pointer 指 標 的 基 本 觀 念 在 C 語 言 中 , 指 標 變 數 的 宣 告 方 式 如 下 : 變數資料型態 * 變數名稱 ; For example int *ptr ; 由 以 上 的 宣 告 , 表 示 了 三 件 事 : ptr 為 指 標 變 數 , ptr 代 表 一 個 位 址 *ptr 代 表 此 位 址 內 的 資 料 ptr 所 指 向 此 位 址 之 變 數 型 態 為 整 數 ( int )
  • 49. 陣 列 Array 與 指 標 Pointer 指 標 變 數 宣 告 的 關 鍵 字 為 &quot; * &quot; , 而 指 標 變 數 的 資 料 型 態 也 分 為 整 數 ( int ) , 浮 點 數 ( float ) , 字 元 ( char ) 三 種 . &quot;&&quot; 為另一重要符號, &quot;&&quot; 為一個特殊運算子,目的為傳回運算元之位址 為什麼 scanf() 中之所有引數變數一定要加上 &quot;&&quot; 符號 ???………. Example: #include < stdio.h > void main(void) { int x=10; int *y; y=&x; printf(&quot; x = %d\n&quot;, x); printf(&quot;&x = %x\n&quot;,&x); printf(&quot;*y = %d\n&quot;,*y); printf(&quot; y = %x\n&quot;, y); } 執行結果 : x = 10 &x = ffda *y = 10 y = ffda
  • 50. 陣 列 Array 與 指 標 Pointer 指 標 與 函 數 間 的 關 係 關 於 函 數 呼 叫 的 方 式 中 , Call by value 的 引 數 傳 遞 方 式 , 被 呼 叫 函 數 不 能 直 接 更 改 呼 叫 函 數 中 的 變 數 , 但 如 果 是 以 指 標 當 作 函 數 的 引 數 ( Call by reference ) , 則 上 述 的 狀 況 均 迎 刃 而 解 , 而 且 也 不 受 函 數 返 回 值 ( return ) 只 能 有 一 個 的 影 響 . Example: #include < stdio.h > change(int *x,*y) { int temp; temp=*x; *x=*y; *y=temp; } void main(void) { int m=3,n=4; printf(&quot; m = %d n= %d \n\n&quot;,m,n); change(&m,&n); printf(&quot; m = %d n= %d \n&quot;,m,n); } 執行結果 : m = 3 n= 4 m = 4 n= 3
  • 51. 陣 列 Array 與 指 標 Pointer 指 標 與 陣 列 的 關 係 我 們 可 以 將 指 標 與 陣 列 的 關 係 來 做 一 對 比 . 例 如 : 有 一 整 數 陣 列 名 為 array , 其 陣 列 大 小 為 五 個 , 其 內 容 分 別 是 1,2,3,4,5 . For example: int array[5]={ 1,2,3,4,5 }; array[0]=1 <--> *(array+0)=1 array[1]=2 <--> *(array+1)=2 array[2]=3 <--> *(array+2)=3 array[3]=4 <--> *(array+3)=4 array[4]=5 <--> *(array+4)=5
  • 52. 陣 列 Array 與 指 標 Pointer 指 標 與 字 元 陣 列 ( 字 串 ) 間 的 關 係 string[0]=P <--> *(string+0)=P string[1]=O <--> *(string+1)=O string[2]=I <--> *(string+2)=I string[3]=N <--> *(string+3)=N string[4]=T <--> *(string+4)=T string[5]=E <--> *(string+5)=E string[6]=R <--> *(string+6)=R
  • 53. 陣 列 Array 與 指 標 Pointer 指 標 與 陣 列 的 混 合 應 用 指標之運算有兩種: (+) 、 (-) 假設指標 ptr 所指資料為整數,且其為指為 1666 指令 執行結果 執行動作 ptr++ 1668 指向下一個整數位址 ptr-- 1664 指向前一個整數位址 ptr+7 1674 指向第七個整數位址
  • 54. Q & A 發問時間