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

C說話 用指針作為函數前往值詳解

編輯:關於C++

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


C說話許可函數的前往值是一個指針(地址),我們將如許的函數稱為指針函數。上面的例子界說了一個函數 strlong(),用來前往兩個字符串中較長的一個:

#include <stdio.h>
#include <string.h>
char *strlong(char *str1, char *str2){
  if(strlen(str1) >= strlen(str2)){
    return str1;
  }else{
    return str2;
  }
}
int main(){
  char str1[30], str2[30], *str;
  gets(str1);
  gets(str2);
  str = strlong(str1, str2);
  printf("Longer string: %s\n", str);
  return 0;
}

運轉成果:

C Language↙
c.biancheng.net↙
Longer string: c.biancheng.net

用指針作為函數前往值時須要留意的一點是,函數運轉停止後會燒毀在它外部界說的一切部分數據,包含部分變量、部分數組和情勢參數,函數前往的指針請盡可能不要指向這些數據,C說話沒有任何機制來包管這些數據會一向有用,它們在後續應用進程中能夠會激發運轉時毛病。請看上面的例子:

#include <stdio.h>
int *func(){
  int n = 100;
  return &n;
}
int main(){
  int *p = func(), n;
  n = *p;
  printf("value = %d\n", n);
  return 0;
}

運轉成果:

value = 100

n 是 func() 外部的部分變量,func() 前往了指向 n 的指針,依據下面的不雅點,func() 運轉停止後 n 將被燒毀,應用 *p 應當獲得不到 n 的值。然則從運轉成果來看,我們的推理似乎是毛病的,func() 運轉停止後 *p 仍然可以獲得部分變量 n 的值,這個下面的不雅點不是相悖嗎?

為了進一步看清成績的實質,無妨將下面的代碼稍作修正,在第9~10行之間增長一個函數挪用,看看會有甚麼後果:

#include <stdio.h>
int *func(){
  int n = 100;
  return &n;
}
int main(){
  int *p = func(), n;
  printf("c.biancheng.net\n");
  n = *p;
  printf("value = %d\n", n);
  return 0;
}

運轉成果:

c.biancheng.net
value = -2

可以看到,如今 p 指向的數據曾經不是本來 n 的值了,它釀成了一個毫有意義的乃至有些奇異的值。與後面的代碼比擬,該段代碼僅僅是在 *p 之前增長了一個函數挪用,這一細節的分歧卻招致運轉成果有天地之別,畢竟是為何呢?

後面我們說函數運轉停止後會燒毀一切的部分數據,這個不雅點並沒錯,年夜部門C說話教材也都強調了這一點。然則,這裡所謂的燒毀其實不是將部分數據所占用的內存全體抹失落,而是法式廢棄對它的應用權限,棄之不睬,前面的代碼可以隨便應用這塊內存。關於下面的兩個例子,func() 運轉停止後 n 的內存仍然堅持原樣,值照樣 100,假如應用實時也可以或許獲得准確的數據,假如有其它函數被挪用就會籠罩這塊內存,獲得的數據就掉去了意義。

關於函數挪用的道理和函數若何占用內存的更多細節,我們將在《C說話和內存》專題中深刻商量,信任你勢必有所頓悟,解高興中的謎團。

第一個例子在挪用其他函數之前應用 *p 爭先取得了 n 的值並將它保留起來,第二個例子明顯沒有捉住機遇,有其他函數被挪用後才應用 *p 獲得數據,這個時刻曾經晚了,內存曾經被後來的函數籠罩了,而籠罩它的畢竟是一份甚麼樣的數據我們無從揣摸(普通是一個沒成心義乃至有些奇異的值)。

以上就是對 C說話指針作為函數前往值的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

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