程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 學點C語言(37):函數 - 常量(const)參數

學點C語言(37):函數 - 常量(const)參數

編輯:關於C語言

非指針參數(也就是傳值參數)不會被修改原始值,const 對它是沒有意義的.

const 只用於指針.

1. 第一種用法: const 類型 *變量:

這種用法將限制修改指針指向的值.

#include <stdio.h>

int fun(const int *p) {
  *p += 1;  /* 只有去掉 const 這句才可以執行 */
  return *p;
}

int main(void)
{
  int num = 3;
  printf("%d\n",fun(&num));

  getchar();
  return 0;
}

2. 不過也有辦法繞過這個限制:

#include <stdio.h>

int fun(const int *p) {
  int *p2 = p; /* 來個重名指針會繞過 const 的限制 */
  *p2 += 1;
  return *p;
}

int main(void)
{
  int num = 3;
  printf("%d\n",fun(&num)); /* 4 */

  getchar();
  return 0;
}

2. 第二種用法: 類型 *const 變量:

這種用法將限制指針的指向; 下面的例子企圖修改指針,不會成功.

#include <stdio.h>

void swap(int *const p1,int *const p2) {
  int *t = p1;
  p2 = p1;
  p2 = t;
}

int main(void)
{
  int x = 111;
  int y = 222;

  printf("%d,%d\n",x,y);
  swap(&x,&y);
  printf("%d,%d\n",x,y);

  getchar();
  return 0;
}

3. 其實不使用 *const,指針也不會被修改:

還是上面的例子,去掉 const... 函數也不會成功.

這是為什麼呢? 因為指針的本身作為參數時也只是個副本(不過副本指向的值可是真的).

#include <stdio.h>

void swap(int *p1,int *p2) {
  int *t = p1;
  p2 = p1;
  p2 = t;
}

int main(void)
{
  int x = 111;
  int y = 222;

  printf("%d,%d\n",x,y);
  swap(&x,&y);
  printf("%d,%d\n",x,y);

  getchar();
  return 0;
}

4. 但第二種方法不會現在修改指針指向的值:

這也最終可以完成這個 swap 函數; 就這個函數本身來講,完全可以不用 const.

#include <stdio.h>

void swap(int *const p1,int *const p2) {
  int t = *p1;
  *p1 = *p2;
  *p2 = t;
}

int main(void)
{
  int x = 111;
  int y = 222;

  printf("%d,%d\n",x,y);
  swap(&x,&y);
  printf("%d,%d\n",x,y);

  getchar();
  return 0;
}

5. 甚至可以兩種手段一起上:

#include <stdio.h>

int fun(int const *const p1,int const *const p2) {
  return *p1 + *p2;
}

int main(void)
{
  int x = 111;
  int y = 222;

  printf("%d\n",fun(&x,&y));

  getchar();
  return 0;
}

返回“學點C語言 - 目錄”

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved