1,函數的基本知識
C++對於傳回值的類型有一定的限制:不能是數組,但可以使其他任何類型,甚至可以使結構和對象。
有趣的是,雖然數組不可以作為返回對象,但是數組可以作為結構或對象組成部分來返回。
2,函數參數和按值傳遞
cin.get();//讀取所有輸入的字元,包括空格和分行符號。
cin>> ;//跳過空格和分行符號讀取。
3,函數和數組
int arr[32];
int sum_arr(int arr[],int n);//參數arr是一個指標,而不是一個數組。
int sum_arr(int *arr,int n); //僅用於函數頭,函數原型中 int *arr 跟 int arr[]的含義相同
恒等式:
arr[i] == *(arr+i); //值
&arr[i] == arr+i; //地址
4,數組名和指標對應的好處?
節省賦值整個數組所需的時間和記憶體
使用未經處理資料增加了破壞資料的風險
5,為什麼需要傳遞數組長度?
不能通過sizeof(arr) 計算數組的長度。原因是sizeof(arr)只是指標變數的值。
6,重要的問題:在C語言中“&”的妙用
在C++程式聲明變數的時候的&,只是表明“它是一個引用,這個引用聲明時不開闢新空間,它在記憶體配置表加入新的一行,該行記憶體位址等於和調用時傳入的對應參數記憶體位址”
例子:
#include "stdio.h"</p><p>void inc(int *data)<br />{<br />(*data)++;<br />}<br />int main()<br />{<br />int a=0;<br />inc(&a); //調用是關鍵<br />printf("%d\n",a);<br />return 0 ;<br />}<br />#include"stdio.h"<br />#include"malloc.h"<br />#include"string.h"<br />void TestFunction(char** ptr1, char*& ptr2)<br />{<br /> *ptr1 = "abc";<br /> ptr2 = (char*)malloc(6);<br /> strcpy(ptr2, "abc");<br />}</p><p>int main()<br />{<br /> char* ptr1 = NULL, *ptr2 = NULL;<br /> TestFunction(&ptr1, ptr2);<br /> printf("%s\n", ptr1);<br /> printf("%s\n", ptr2);<br /> free(ptr2);<br />}
7,指標和const
1)指標指向一個常量對象:int age=39;
const int *pt=&age;
防止使用該指標來修改所指向的值。 不能用(*pt)++修改變數的值。但可以通過修改 age的值來更改 指標指向的值
pt可以指向另一個變數。
2)指標本身聲明為常量:int *const pt;
pt可以用來修改值,pt不能指向其他變數。
【注意】C++禁止將const的地址賦給非const指標。
常量不能作為形參傳遞給非常量函數。
8,函數和C-風格字串
1)字串作為參數來傳遞,實際傳遞的是字串的第一個字元的地址。
2)字串內建結束符“/0”而字元數組沒有
3)函數無法返回字串,但可以返回字串的地址。
9,函數和結構、String對象
1)函數可以返回結構,但是結構名只是名稱,而不像數組名代表地址。要想擷取地址只能使用地址操作符"&"
2)String 對象採用 getline(cin,str[i]);執行個體:
#include <iostream><br />#include <string><br />using namespace std;</p><p>void display(const string s[],int n)<br />{<br />for(int i=0;i<n;i++)<br /> cout<<i+1<<":"<<s[i]<<endl;<br />}<br />int main()<br />{<br />string list[3];<br />for(int i=0;i<3;i++)<br /> getline(cin,list[i]);</p><p>display(list,3);<br />}10,函數指標
1)原理:將函數的地址當做參數傳遞給相應函數
2)測試源碼:
#include <iostream><br />using namespace std;<br />double besy(int lns)<br />{<br />return 0.05*lns;<br />}<br />double estimate(int lines,double (*pf)(int))//第二個形參含義為函式宣告 double pm(int data)<br /> //只不過將函數名 pm替換成了 (*pf)<br /> //pf 是一個指向函數的指標<br />{<br />cout<<lines<<"lines will take\n";<br />cout<<(*pf)(lines)<<" hour (s)\n";</p><p>}<br />int main()<br />{<br />/*執行過程講解:<br /> 函數實參為 lines=16 besy(lines=16)<br /> */<br />estimate(16,besy);</p><p>}<br />11,總結
1)預設情況下,C++函數按值傳遞參數。意味著形參是新的變數,他們被初始化為函數調用所提供的值。因此C++通過使用拷貝,保護了未經處理資料的完整性。
2)使用函數的三個步驟:定義函數、提供原型、調用函數
3)*"tianshuai"表示的含義:t //"tianshuai"被解析為字元數組第一個元素的地址。而加上*表示取的一個元素的值
"tianshuai"[2] 表示 第三個元素 a //理由同上