您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第12讲-传值、传址和传引用
发布时间:2021-05-13 21:53:05编辑:雪饮阅读()
在编写个人函数的时候,你将受到C++中一条基本原则的限制:在默认的情况下,参数只能以值传递的方式给函数。这句话的理解是:被传递到函数的只是变量的值,永远不会是变量本身
一個改變年齡的程序
這個程序很簡單,具體實例如:
#include <iostream>
using namespace std;
void changeAge(int age,int newAge){
age=newAge;
std::cout<< " In this , my age is "<< age << "\n";
}
int main()
{
int age=24;
std::cout<<"My age is "<< age <<"\n";
changeAge(age,age+1);
std::cout<<"Now my age is "<< age << "\n";
}
編譯運行結果如:
My age is 24
In this , my age is 25
Now my age is 24
请按任意键继续. . .
绕开“值传递”问题的第一种方法是向函教传递变量的地址取代它的值。我们说C语言强大,有很大一部分就是在于他的灵活,他的灵活,有大一部分就是可以利用指针进行委婉地乱改。。。正如我们所理解的,想要获取某个变量的地址只需要在它前边加上一个“取地址”操作符(&)就行了。
#include <iostream>
void changeAge( int *age, int newAge );
// 如果想要实现计划功能,需要怎么改?
main()
{
int age = 24;
std::cout << "My age is " << age << "\n";
changeAge( &age, age+1 );
std::cout << "Now my age is " << age << "\n";
}
void changeAge( int *age, int newAge )
{
*age = newAge;
std::cout << "In this , my age is " << *age << "\n";
}
編譯運行結果如:
My age is24
In this , my age is25
Now my age is25
请按任意键继续. . .
注意:如果传过去的是地址,在函教中必须要通过“*”对指针进行解引用,除非你有其他用途。
练习题:swap.cpp
#include <iostream>
using namespace std;
void swap(int *x,int*y){
int temp;
/*
這裏可以看到x作爲右值正常打印,它是地址
而*x則是解引用
*/
std::cout<<"\n x:"<<x<<",*x:"<<*x<<"\n";
temp=*x;
/*
而儅*x作爲左值的時候,它就不在是一個常量了,它則是原來x的地址
等價于原來的變量x
*/
*x=*y;
*y=temp;
}
int main()
{
int x,y;
std::cout<<"請輸入兩個不同的值:";
/*
cin>>x的返回對象還是cin,所以cin>>x>>y相當於cin>>x,cin>>y
這樣寫就剩下了一點代碼。。。
*/
std::cin>>x>>y;
swap(&x,&y);
std::cout << "調換后輸出:" << x << ' ' << y << "\n\n";
}
編譯運行結果如:
請輸入兩個不同的值:1 2
x:0x66ff24,*x:1
調換后輸出:2 1
请按任意键继续. . .
另外的一种不需要有中間變量互换的方案即用異或來實現
一個實例如:
#include <iostream>
void swap( int *x, int *y )
{
/*
假定x為1,y為2
利用异或操作
x與2異或賦值=>*x=1^2
異或:
0^0=0;
0^1=1;
1^0=1;
1^1=0;
即按位或的反向(除了兩個對應位都為0)
則*x=1^2=>0000 0001^ 0000 0010
*x=>0000 0011
*x=3
*/
*x ^= *y;
/*
*y=2^3=>0000 0010^ 0000 0011
*y=>0000 0001
*y=1
*/
*y ^= *x;
/*
*x=3^1=>0000 0011 ^ 0000 0001
*x=>0000 0010
*x=2
*/
*x ^= *y;
}
main()
{
int x, y;
std::cout << "请输入两个不同的值:";
std::cin >> x >> y;
swap( &x, &y );
std::cout << "调换后输出:" << x << ' ' << y << "\n\n";
}
然後編譯運行結果如:
请输入两个不同的值:1 2
调换后输出:2 1
请按任意键继续. . .
C-Free中的斷點與調試與反匯編
這裏代碼假定恢復到上面第一次的swap交換程序。
這裏鼠標右鍵可以看到F10是設置取消斷點,按F10就可以看到斷點被設置上了,被設置的斷點位於當前鼠標光標所在行
如何進入反匯編呢?設置好斷點后點擊工具欄裏面的“調試>開始調試”然後可以看到工具欄下面多出了幾個圖標,其中“顯示/隱藏控制臺窗口(Alt+7)”就可以打開或關閉控制臺
打開控制臺后輸入命令如:disas main然後點擊右邊的“發送”即可
這裏main只是你要進行反匯編的函數名
Visual Studio Team System 2008 团队资源管理器的編譯調試及反匯編
在甲魚視頻中用的vs2008就是Visual Studio Team System 2008
於是在微軟官網下載的Visual Studio Team System 2008
但是安裝后發現新建項目時候竟然要選擇服務器,有點納悶,一個c++項目且我們的目標不是服務端程序,但是要選擇服務器就很離譜,可能有開發者的一些額外考慮,而我們只是管中窺豹,只關注在了自己的目標上了。
後來發現正確的建立項目是從起始頁來建立項目的
到了這一步中又會發現這裏沒有任何模板,記憶中好像也沒有項目類型可選,百度一波答案都是抄來抄去,而且對於目前win10環境不適合,於是乎找到另外一個vs2008,於是乎在下載之家找到了一個vs2008,這個體積大,而且我下載之後安裝類型選擇的是最大化安裝。
這個vs2008的下載地址如:http://www.downza.cn/soft/10343.html
然後安裝結束之後進入此界面就有模板了,選擇好c++類型和右邊的win32控制臺應用程序類型(其實在甲魚視頻中右邊應該是選擇c++文件.cpp類型的,不知道爲什麽,反正這裏面是沒有…不糾結它了,浪費時間操)
建立好項目后打開默認的cpp文件然後貼入上面c-free5中最後一次我們運行的那個指針交換程序,然後在工具欄“調試>開始執行(不調試)(H) Ctrl+F5”
就可以看到程序被編譯運行了如:
斷點調試肯定要先打斷點,這裏打斷點直接鼠標右鍵裏面就可以在當前光標処插入斷點
然後啓動調試
卡在斷點的時候在工具欄中斷點圖標下拉中可以選擇反匯編
然後就可以進入了反匯編的界面了
vs2008的編譯標準c99
在vs2008中好像是嚴格遵循c99標準,比如下面這個函數沒有返回值卻沒有用void聲明,而是直接不寫返回值類型,則編譯就會報錯。
那麽像是加入一個返回值類型如int就沒有問題了
其實在原甲魚這裏,不僅僅要加返回值,而且函數躰中也要有return語句,但是這裏沒有return也沒有問題,可能是因爲這個vs2008和甲魚那個版本不同,也可能是操作系統環境等不同,具體的原因不曉得,反正這種不帶return的函數,是被稱爲未定義的返回值,這種類型也不是標準的,是不推薦的,這裏具體原因可能影響的因素較多,就不糾結了,浪費時間。
关键字词:vs2008,引用,传址