C++學習五
函式-C++程式設計模組
給出一個基本的函式宣告框架
函式引數與按值傳遞
對於一個函式而言,當它被呼叫時,引數都是按值傳遞的,也就是說傳進去的只是一個副本,無論你對這個副本做任何修改都是對實際引數沒有任何影響的。而在函式中宣告的變數包括形參全部都是函式所私有的,被呼叫時,計算機為它們分配記憶體,當呼叫完畢時,計算機會釋放這些記憶體。舉個例子
#include <fstream>
#include <iostream>
using namespace std;
void cube(int x)
{
x = x*x*x;
cout << x << endl;
}
int main()
{
int x = 2;
cube(x);
cout << x << endl;
return 0;
}
輸出結果:
8
2
但如果傳進去的是一個引用或者指標,情況則大不一樣,不信我們試試
#include <fstream>
#include <iostream>
using namespace std;
void cube(int& x)//void cube(int* x)
{
x = x*x*x;
cout << x << endl;//列印8
}
int main()
{
int x = 2;
cube(x);//cube(&x)
cout << x << endl;//列印8
return 0;
}
先說引用,引用只是一個別名,實際的主體只有一個,其中不涉及拷貝物件,從始至終就只有一個物件,所以形參作為引用是不佔用記憶體空間的,因此你對這個形參的任何操作都會反映到實參上去。指標的話很簡單,你傳進去的是一個地址值,這個地址值不管你影印多少個它始終是一個地址,就好比你門牌號不管影印多少個,最終房子只有一個,所以你傳進去的指標它指向的記憶體是不會變的,那麼你通過指標間接訪問修改其實也是完全沒有問題,符合預期的,因為這房子是真真實實存在的。
注:兩個恆等式
arr[i]==*(arr+i)
&arr[i]==arr+i
指標和const
有三種指標,區別在於const的位置
const int*p;//指向常量的指標,即不能通過*p修改
int const *p;//指向常量的指標
const int*const p;//指標常量,即p本身不能修改
int* const p;//指向常量的常指標,即*p和p都不能被修改
例子
int x=3;
const int*p=&x;//ok
*p=4;//error,*p不是可修改的左值
cout<<*p<<endl;//display 3
x=4;//ok
cout<<*p<<endl;//display 4;
int*const q=&x;//ok
int y=8;
q=&y;//error,q不能被修改
函式和二維陣列
int data[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//一個二維陣列
int total=sum(data,3);//error
如果要計算這個二維陣列的和,那麼該如何傳遞這個引數?很顯然data有三個元素,每個元素都是一個包含四個整數的一維陣列。所以data型別是一個指向4個整數的陣列的指標,正確的原型如下:
int sum(int (*p)[4],3);//第一種
int sum(int p[][4],3);//第二種
二維陣列元素訪問和指標的關係
arr[3][4]=*(*(arr+3)+4);
函式與結構
主要涉及函式的按值傳遞和按地址傳遞,由於按值傳遞涉及到拷貝,所以一旦結構體過大,那麼拷貝所帶來的花銷也就更大,因此按地址傳遞才是比較合理的選擇,傳進一個指標,然後用指標來訪問內部成員。
相關文章
- c++學習筆記(五)C++筆記
- C++學習筆記-五大基本概念C++筆記
- Mudo C++網路庫第五章學習筆記C++筆記
- 學習C++C++
- c++學習C++
- MFC學習(五)
- Scala學習(五)練習
- 如何學習C++?C++
- C++ 自我學習C++
- C++學習四C++
- C++學習(49)C++
- C++學習(50)C++
- C++學習(46)C++
- C++學習(47)C++
- C++學習(48)C++
- C++學習安排C++
- c/c++ 學習C++
- C++ Prime 學習C++
- 函式學習五函式
- EXP/IMP 學習(五)
- C++學習步驟(C++該如何學)C++
- 演算法學習記錄五(C++)--->兩個棧實現佇列演算法C++佇列
- c++學習總結C++
- c++學習記錄C++
- C++學習篇(2)C++
- C++ STL學習——vectorC++
- C++學習筆記C++筆記
- C++ Builder 學習1C++UI
- JVM 學習筆記(五)JVM筆記
- python學習之旅(五)Python
- cmake學習筆記(五)筆記
- VUEX 使用學習五 : getterVue
- iOS學習資源(五)iOS
- js學習五-JSONJSON
- Javascript 學習 筆記五JavaScript筆記
- 學習Java第五週Java
- C/C++學習路線———學習筆記C++筆記
- C++學習筆記——C++ 繼承C++筆記繼承