程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話 指針變量作為函數參數詳解

C說話 指針變量作為函數參數詳解

編輯:關於C++

C說話 指針變量作為函數參數詳解。本站提示廣大學習愛好者:(C說話 指針變量作為函數參數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話 指針變量作為函數參數詳解正文


在C說話中,函數的參數不只可所以整數、小數、字符等詳細的數據,還可所以指向它們的指針。用指針變量作函數參數可以將函數內部的地址傳遞到函數外部,使得在函數外部可以操作函數內部的數據,而且這些數據不會跟著函數的停止而被燒毀。

像數組、字符串、靜態分派的內存等都是一系列數據的聚集,沒有方法經由過程一個參數全體傳入函數外部,只能傳遞它們的指針,在函數外部經由過程指針來影響這些數據聚集。

有的時刻,關於整數、小數、字符等根本類型數據的操作也必需要借助指針,一個典范的例子就是交流兩個變量的值。

有些初學者能夠會應用上面的辦法來交流兩個變量的值:

#include <stdio.h>
void swap(int a, int b){
  int temp; //暫時變量
  temp = a;
  a = b;
  b = temp;
}
int main(){
  int a = 66, b = 99;
  swap(a, b);
  printf("a = %d, b = %d\n", a, b);
  return 0;
}

運轉成果:

a = 66, b = 99

從成果可以看出,a、b 的值並沒有產生轉變,交流掉敗。這是由於 swap() 函數外部的 a、b 和 main() 函數外部的 a、b 是分歧的變量,占用分歧的內存,它們除名字一樣,沒有其他任何干系,swap() 交流的是它外部 a、b 的值,不會影響它內部(main() 外部) a、b 的值。

改用指針變量作參數後就很輕易處理下面的成績:

#include <stdio.h>
void swap(int *p1, int *p2){
  int temp; //暫時變量
  temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}
int main(){
  int a = 66, b = 99;
  swap(&a, &b);
  printf("a = %d, b = %d\n", a, b);
  return 0;
}

運轉成果:

a = 99, b = 66

挪用 swap() 函數時,將變量 a、b 的地址分離賦值給 p1、p2,如許 *p1、*p2 代表的就是變量 a、b 自己,交流 *p1、*p2 的值也就是交流 a、b 的值。函數運轉停止後固然會將 p1、p2 燒毀,但它對內部 a、b 形成的影響是“耐久化”的,不會跟著函數的停止而“恢回復復興樣”。

須要留意的是暫時變量 temp,它的感化特殊主要,由於履行*p1 = *p2;語句後 a 的值會被 b 的值籠罩,假如不先將 a 的值保留起來今後就找不到了。

用數組作函數參數

數組是一系列數據的聚集,沒法經由過程參數將它們一次性傳遞到函數外部,假如願望在函數外部操作數組,必需傳遞數組指針。上面的例子界說了一個函數 max(),用來查找數組中值最年夜的元素:

#include <stdio.h>
int max(int *intArr, int len){
  int i, maxValue = intArr[0]; //假定第0個元素是最年夜值
  for(i=1; i<len; i++){
    if(maxValue < intArr[i]){
      maxValue = intArr[i];
    }
  }
  
  return maxValue;
}
int main(){
  int nums[6], i, maxValue;
  int len = sizeof(nums)/sizeof(int);
  //讀取用戶輸出的數據並賦值給數組元素
  for(i=0; i<len; i++){
    scanf("%d", nums+i);
  }
  printf("Max value is %d!\n", max(nums, len));
  return 0;
}

運轉成果:

12 55 30 8 93 27↙
Max value is 93!

參數 intArr 僅僅是一個數組指針,在函數外部沒法經由過程這個指針取得數組長度,必需將數組長度作為函數參數傳遞到函數外部。數組 nums 的每一個元素都是整數,scanf() 在讀取用戶輸出的整數時,請求給出存儲它的內存的地址,nums+i就是第 i 個數組元素的地址。

用數組做函數參數時,參數也可以或許以“真正”的數組情勢給出。例如關於下面的 max() 函數,它的參數可以寫成上面的情勢:

int max(int intArr[6], int len){
  int i, maxValue = intArr[0]; //假定第0個元素是最年夜值
  for(i=1; i<len; i++){
    if(maxValue < intArr[i]){
      maxValue = intArr[i];
    }
  }
  return maxValue;
}

int intArr[6]似乎界說了一個具有 6 個元素的數組,挪用 max() 時可以將數組的一切元素“一股腦”傳遞出去。

讀者也能夠省略數組長度,把形參簡寫為上面的情勢:

int max(int intArr[], int len){
  int i, maxValue = intArr[0]; //假定第0個元素是最年夜值
  for(i=1; i<len; i++){
    if(maxValue < intArr[i]){
      maxValue = intArr[i];
    }
  }
  return maxValue;
}

int intArr[]固然界說了一個數組,但沒有指定命組長度,似乎可以接收隨意率性長度的數組。

現實上這兩種情勢的數組界說都是假象,不論是int intArr[6]照樣int intArr[]都不會創立一個數組出來,編譯器也不會為它們分派內存,現實的數組是不存在的,它們終究照樣會轉換為int *intArr如許的指針。這就意味著,兩種情勢都不克不及將數組的一切元素“一股腦”傳遞出去,年夜家還得規規則矩應用數組指針。

int intArr[6]這類情勢只能解釋函數希冀用戶傳遞的數組有 6 個元素,其實不意味著數組只能有 6 個元素,真正傳遞的數組可以有少於或多於 6 個的元素。

須要強調的是,不論應用哪一種方法傳遞數組,都不克不及在函數外部求得數組長度,由於 intArr 僅僅是一個指針,而不是真實的數組,所以必需要額定增長一個參數來傳遞數組長度。

C說話為何不許可直接傳遞數組的一切元素,而必需傳遞數組指針呢?

參數的傳遞實質上是一次賦值的進程,賦值就是對內存停止拷貝。所謂內存拷貝,是指將一塊內存上的數據復制到另外一塊內存上。

關於像 int、float、char 等根本類型的數據,它們占用的內存常常只要幾個字節,對它們停止內存拷貝異常疾速。而數組是一系列數據的聚集,數據的數目沒無限制,能夠很少,也能夠不計其數,對它們停止內存拷貝有能夠是一個漫長的進程,會嚴重拖慢法式的效力,為了避免身手欠安的法式員寫出低效的代碼,C說話沒有從語法上支撐數據聚集的直接賦值。

除C說話,C++、Java、Python 等其它說話也制止對年夜塊內存停止拷貝,在底層都應用相似指針的方法來完成。

以上就對C 說話指針變量作為函數參數停止的材料整頓,後續持續整頓相干常識,感謝年夜家對本站的支撐!

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