C++學習五

zjyhyrl123發表於2020-11-25

函式-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);

函式與結構

主要涉及函式的按值傳遞和按地址傳遞,由於按值傳遞涉及到拷貝,所以一旦結構體過大,那麼拷貝所帶來的花銷也就更大,因此按地址傳遞才是比較合理的選擇,傳進一個指標,然後用指標來訪問內部成員。