c語言的重要概念

來源:互聯網
上載者:User

一、C語言的指標
1.指標說明
  指標是包含另一變數的地址變數。
  (1)int *p
  p是一個指標,指向一個整形數。
  (2)int *p()
  p是一個函數,該函數返回一個指向整數的指標。
  (3)int (*p)()
  p是一個指標,該指標指向一個函數,這個函數返回一個整數。
  (4)int *p[]
  p是一個數組,該數組的每一個元素是指向整數的指標。
  (5)int (*p)[]
  p是一個指標,該指標指向一個數組,這個數組的每一個元素是一個整數。
  (6)int *(*p)()
  p是一個指標,該指標指向一個函數,這個函數返回一個指向整數的指標。
2.指標的初始化(賦地址)
  (1)通過符號&取變數(包括結構變數、數組第一個元素)的地址賦給指標;
  (2)把數組名賦給指標;
  (3)把函數名賦給指向函數的指標;
  (4)動態分配記憶體
  例:struct c{double r,i;};
  struct c *p;
  p=(struct c *)malloc(sizeof(struct c));
3.指標與數組、函數的關係
  (1)對於一維數組 int a[i] 或指標 int *a
  a+i 指向 a[i]
  (2)對於字串 char s[i] 或指標 char *s
  s+i 指向第 i個字元 s[i]
  (3)對於二維數組int a[i][j]
  *a+j 指向 a[0][j]
  *(a+i) 指向 a[i][0]
  *(a+i)+j 指向 a[i][j]
  例:對於 a[2][3]={1,2,3,4,5,6,}; 有 *(*(a+1)+1)=5;
  (4)對於字串數組char p[i][j] 或字元型指標數組char *p[i]
  *p+j 指向第 0個字串的第 j個字元
  *(p+i) 指向第 i個字串的第 0個字元
  *(p+i)+j 指向第 i個字串的第 j個字元
  例:對於 *p[]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
  例:對於 char p[][3]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
  (5)對於指標數組int *a[i]
  a[i] 指向 變數i
  即 *a[i]=變數i 或 a[i]=&變數i
  (6)對於結構struct XY
  {int x;int *y}*p;
  p是指向結構XY的指標
  (*p).x 或 p->x 是表示 x 的內容
  (*p).y 或 p->y 是表示指標 y 的值(地址)
  *(*p).y 或 *p->y 是表示 y 所指的內容
  &(*p).x 或 &p->x 是表示 x 的地址
  (7)指向函數的指標
  對於 void func(char *str)
  {…}; //定義了一個函數
  void (*p)(char*);//定義了一個函數指標
  p=func; //讓指標指向函數
  則(*p)("…"); //用指標p可以調用函數func
  (8)指向多個不同函數的指標數組
  對於void function_1() {…};
  …
  void function_4() {…}; //定義了四個函數
  typedef void(*menu_fcn)();//定義了指向函數的指標
  menu_fcn command[4]; //定義了指標數組
  command[0]=function_1;
  …
  command[3]=function_4; //讓指標數組指向四個函數
  則command[0](); //用指標數組中的一個元素調用一個函數
4.指標的分類
  (1)近指標(near):
  近指標為16位指標,它只含有地址的位移量部分。近指標用於不超過64K 位元組的單個資料區段或程式碼片段。在微、小和中編譯模式下產生的資料指標是近指標(預設狀態);在微、小和中編譯模式下產生的碼指標(指向函數的指標)是近指標(預設狀態)。
  (2)遠指標(far)
  遠指標為32位指標,指標的段地址和位移量都在指標內。可用於任意編譯模式。每次使用遠指標時都要重裝段寄存器。遠指標可定址的目標不能超過64K ,因為遠指標增減運算時,段地址不參與運算。在緊湊、大和巨模式下編譯產生的資料指標是遠指標(預設狀態)。
  (3)巨指標(huge)
  巨指標為32位指標,指標的段地址和位移量都在指標內。可用於任意編譯模式。遠指標定址的目標可以超過64K 。巨指標是規則化的指標。
5.指標的轉換
  (1)遠指標轉換成巨指標
  使用以下函數
  void normalize(void far * * p)
  {
  *p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
  }
6.指標的使用
  (1)將浮點數轉換成位元
  float ff=16.5;
  unsigned char *cc;
  (float*)cc=&ff;
  //此時cc的內容為"00008441"
  //即cc第一個位元組=0;第二個位元組=0;第三個位元組=0x84;第四個位元組=0x41;
  (2)將位元轉換成浮點數
  float ff;
  unsigned char *cc;
  cc=(unsigned char*)malloc(4);
  cc=(unsigned char*)&ff;
  *(cc+0)=0;
  *(cc+1)=0;
  *(cc+2)=0x84;
  *(cc+3)=0x41;
  //此時ff=16.5
  free(cc);

二、C 語言的函數
1.使用者自訂函數格式
  類型 函數名(形式參數表)
  參數說明
  {
  ……
  }
2.函數的調用方式
  (1)傳值方式
  ①傳給被調用函數的是整型、長整型、浮點型或雙精確度型變數。被調用的函數得定義相應的變數為形參。
  ②傳給被調用函數的是結構變數。被調用函數得定義結構變數為形參。
  ③傳給被調用函數的是結構變數的成員。被調用函數得定義與該成員同類的變數為形參。
  (2)傳址方式
  ①傳給被調用函數的是變數的地址。被調用函數得定義指標變數為形參。
  ②傳給被調用函數的是數組的地址即數組名。被調用的函數得定義數組或指標變數為形參。
  ③傳給被調用函數的是函數的地址即函數名稱。被調用函數得定義指向函數的指標變數為形參。
  ④傳給被調用函數的是結構的地址。被調用函數得定義結構指標為形參。
3.函數調用(傳值方式)結果的返回
  (1)返回的是數值
  要求被調用的函數類型與接收傳回值的變數類型相同。
  (2)返回的是指標
  要求被調用的函數是指標函數,其指向的類型與接收的指標變數指向類型相同。
  (3)不返回任何值
  被調用的函數是void型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.