C++ 指標、二級指標、引用傳遞、值傳遞綜合示例
#include <iostream>
using namespace std;
void PassByValue(int a){
// 值傳遞。無法修改原值
a = 10;
return;
}
void PassByReference(int &a){
// 引用傳遞,修改原值
// 這種形式直接實參為 int 變數,或者實參為 int* 解引用得到的 int.
a = 10;
return;
}
void PtrPassByValue(int b){
// 值傳遞。無法修改原值
b = 20;
return ;
}
void PtrPassByPtrValue(int *b){
// 值傳遞。無法修改指標原值,可修改指標所指變數。
*b = 25;
return;
}
void PtrPassByPtrValueAndChangePtr(int *b){
// 值傳遞。無法修改指標原值,可修改指標所指變數。
int c = 30;
b = &c;
return;
}
void PtrPassByPtrRefAndChangePtr(int *&b){
// 想寫指標的別名。
// C風格是用 **, C++ 用 *&
// C++中交換指標的問題 http://blog.csdn.net/zhang_alongzd/article/details/52937684
int c = 35;
b = &c;
return;
}
void PtrPassByPtrRefAndChangePtr2(int *&b){
int c = 35;
int *d = &c;
b = d;
return;
}
void PtrPassByPtrRefAndChangePtr3(int *&b, int *c){
// 引用傳遞。指標的別名,修改指標b。
b = c;
return;
}
void PtrPassByPtrToPtrValueAndChangePtr(int **b, int *c){
// 值傳遞。指標的指標。
*b = c;
return;
}
int main(){
int a = 5;
int *b = &a;
cout << "Value of a: " << a << endl; // 5
PassByValue(a);
cout << "After calling PassByValue: " << a << endl; // 5. 傳值呼叫拷貝給函式形參,無法修改原值。
PassByReference(a);
cout << "After calling PassByReference: " << a << endl; // 10. 傳引用呼叫,函式形參成為 a 的別名
cout << "Value of b: " << *b << endl; // 10. b 一直指向 a,此時解引用後為 a 的值。
// PtrPassByValue(b); // wrong, int* and int don't match
PtrPassByValue(*b);
cout << "After calling PtrPassByValue: " << *b << endl; // b 解引用後是一個 int 值,傳值呼叫拷貝給函式形參,無法修改原值
PtrPassByPtrValue(b);
cout << "After calling PtrPassByPtrValue: " << *b << endl; // 25. b 是 int*,傳值呼叫,將 b 的值,也就是指標地址拷貝給了形參,可修改指標指向的值。
PtrPassByPtrValueAndChangePtr(b);
cout << "After calling PtrPassByPtrValueAndChangePtr: " << *b << endl; // 25. 前段分析同上。此時改指標指向的內容,也就是改變指標所儲存的地址值,因為形參指標與實參指標沒有關聯,是互相獨立的,修改無效。這與 PassByValue(a) 的道理一樣。
// PtrPassByPtrValueAndChangePtr(&b); // wrong, int* and int** mismatch. 直覺地傳指標地址失敗。
// PtrPassByPtrRefAndChangePtr(b);
// cout << "After calling PtrPassByPtrRefAndChangePtr: " << *b << endl; // 1.
PtrPassByPtrRefAndChangePtr2(b);
cout << "After calling PtrPassByPtrRefAndChangePtr2: " << *b << endl; // 1. 與上面這種直接取地址的一樣。。因為區域性變數 int d 被銷燬了?
int cc = 100;
int *c = &cc;
PtrPassByPtrRefAndChangePtr3(b, c);
cout << "After calling PtrPassByPtrRefAndChangePtr3: " << *b << endl; // 100. 成功修改 b 指標。上面值錯了可能是銷燬. 但是指標的確是改了。
b = &a;
cout << "Reset b to a: " << *b << endl; // 25
PtrPassByPtrToPtrValueAndChangePtr(&b, c);
cout << "After calling PtrPassByPtrToPtrValueAndChangePtr: " << *b << endl;
return 0;
}
相關推薦
C++ 指標、二級指標、引用傳遞、值傳遞綜合示例
#include <iostream> using namespace std; void PassByValue(int a){ // 值傳遞。無法修改原值 a = 10; return; } void PassByR
C++中函式引數傳遞(值傳遞、指標傳遞,引用傳遞)
今天想寫一個函式,從函式中把我需要的兩個值傳出來,由於傳出來的值比較多,所以不考慮用return來返回,需要通過引數把修改後的值拉出來供我使用,很當然的就想到了用指標,但是值就是傳不出來;使我對原有的大腦中指標的思維產生混沌感,今天一上午才把函式傳遞又走了
C——提高(2)字串一級指標、二級指標記憶體模型
字串一級指標 C語言裡沒有實質的字串型別,通過字元陣列來模擬。 C語言的字串是以0結尾的字串。 C語言字串的記憶體分配 可以分配在堆上、棧上、全域性區上。 1、字串一級指標記憶體模型 buf陣列與指標的區別: 注意: char buf[20
函式指標、陣列指標、指標陣列、二級指標
函式指標、陣列指標、指標陣列、二級指標 函式指標 函式名就是個指標 函式的指標 ''' bool func(int num) { printf("heihei"); } int main() { bool (func_p)(int num); func_p = func; func_p(10
一級指標、二級指標與字串
c語言中沒有字串型別,通過字元陣列來模擬字串,字串以‘\0’結束。 一、一級指標: 字元陣列的定義: 1.指定長度:char buf[100]={‘a’,‘b’}; 或char buf[100]=“ab”; 如果初始化的字元個數大於陣列長度,將會出現編譯錯
【轉】C++函式引數傳遞中的一級指標和二級指標【【**】】
主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是
C語言參數傳遞(值傳遞、地址傳遞)+二級指針
strong 才有 color 示意圖 mage 影響 -s include expr 參數傳遞 C語言參數傳遞一般分為:值傳遞和地址傳遞 (註意:C語言中沒有引用傳遞,C++才有引用傳遞,因為很多C語言環境是用C++編譯器編譯,使得C看起來支持引用傳遞,導致很多網上很
指標與二級指標筆記(C語言)
一級指標 存放地址的變數稱為指標變數,指標變數是一種特殊的變數。 一般變數存放的是資料本身,指標變數存放的是資料的地址。 int a = 1 ; //普通變數 int *p = NULL ; //一個指向空的int型別的指標變數 p = &a;
關於java的引數傳遞(值傳遞、引用傳遞和傳值、傳引用等)
所謂引數傳遞就是用函式呼叫所給出的實參(實際引數)向函式定義所給出的形參(形式引數)設定初始值的過程。基本的有三種引數分別為: (1)傳值: (2)傳址(即是傳指標) (3)傳引用 以上
C++每個節點的右向指標(用二級指標操作指標)
核心就是用二級指標操作指標,現有一個一級指標TreeLinkNode *p1; 二級指標 TreeLinkNode **p2=&p1; 什麼意思呢,就是一級指標取地址後傳遞給二級指標讓他儲存我的地址,不要多想,就是這麼簡單。 好,現在呢單p2這兩個字母,就是一個二級指標了。那麼p
c/c++指標以及二級指標的理解
指標即是用來指向變數地址的一種工具,其本質還是一個變數; 指標和普通變數之間的異同; 1.不同之處: 指標使用來儲存地址的變數,而普通變數則是用來儲存數值的變數,兩者在定義的
c/c++---之用二級指標操作二維陣列
通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。 參考程式碼如下,可以看具體註釋輔助理解。 #include
C語言之二級指標
#include<stdio.h>int main(){ int a=10; //宣告一個int型變數a int
C語言 通過指標和二級指標遙控資料
// PointerArray.cpp : 定義控制檯應用程式的入口點。 //vs2015 #include “stdafx.h” #include <stdlib.h> void test1(int* p) { *p = 1; } void test2(int *p,int
C語言:結構體中一級指標和二級指標的建立與釋放示例
這幾天把C語言鞏固了一下,作為一門最基本的程式語言,C語言還是相當基礎和非常重要的,個人認為C語言還是很有必要學好吃透的。 今天寫的話題是結構體結構體中一級指標和二級指標的建立與釋放,以一個例子來說明,筆者這裡自己敲得程式碼,雖然用C語言幾年了,但是有的東西還是會遺忘。筆者
c語言中二級指標空間的分配
定義二級指標變數 ,假設是個N介矩陣 int** p;// define int i; p=(int**)malloc(N*sizeof(int*)); for(i=0;i<N;i++) *(p+i)=(int*)malloc(N*sizeof(int)); 千萬別用這
C語言,二級指標,矩陣操作
這麼基礎的操作,都忘光了.... 二級指標引數傳遞之後,一級解引用不知道要解成什麼型別,就會報錯,所以需要(int*)強轉一次轉回來。 呼叫方法不是網上說的(*(MatrixA+i))[j],也不是*(*(MatrixA+i)+j) !!! 可以除錯檢視記憶體,二級指標的
C語言之一級指標與二級指標剖析
什麼是指標? 在電腦科學中,指標(Pointer)是程式語言中的一個物件,利用地址, 它的值直接指向(points to)存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為“指標”。意思是
c語言的一級指標和二級指標作為函式引數,連結串列,malloc中的分配等等總結
主要內容: 1、一級指標和二級指標 2、函式指標傳遞的例子 3、什麼時候需要傳遞二級指標? 4、二級指標在連結串列中的使用 1、一級指標和二級指標 一級指標:即我們一般說的指標,就是記憶體地址; 二級指標:指向指標的指標,就是地址的地址; 如: int a=
C小程式—二級指標第三種記憶體模型
#include "stdio.h"#include "string.h"#include "stdlib.h"int printAarray03(char ** pArray, int num){int i = 0;if (pArray == NULL){return -