1.指標作為函式引數,可以修改函式外的值,而一般變數不行
如下:
#include
#include
#include
using
namespace std;
int a;
voidf(
int*p)
intmain()
這個的執行結果是5,因為指標指向a的位址
2.交換
#include
#include
#include
using
namespace std;
int x,y;
void
swap
(int
*a,int
*b)int
main()
思考:為什麼下列交換方式是失敗的
如上圖紅筆所示,交換xy不過是交換了函式中形參變數的值,形參的值不會影響實參,這對於任何變數都是成立的,所以
不能試圖通過改變形參指標變數的值而使實參變數指標的值改變
函式引數表中的陣列即指標
先來看一段**
#include
#include
#include
using
namespace std;
voidf(
int b)
intmain()
;printf
("%p\n"
,&a[0]
);f(a)
;return0;
}
上面這段**是在f函式和主函式中分別輸出陣列a和b的首位址
執行結果
在這裡可以看到,陣列a和b的首位址是完全一樣的,這與我們一開始所認識的普通變數作為函式引數不同,這裡的a陣列和b陣列完全是同乙個陣列,換句話說,b就是指向a陣列的乙個指標,函式中的int b=int *b
在c/c++中,當陣列作為函式的引數進行傳遞時,陣列就自動退化為同型別的指標
說了這麼多,指標作為函式引數有什麼用呢?
直接上**
#include
#include
#include
using
namespace std;
voidf(
int b)
intmain()
;printf
("%p\n"
,&a[0]
);f(a)
;for
(int i=
0;i<
10;i++
)printf
("%d "
,a[i]);
return0;
}
我們在f內部改掉了陣列b內的值,上文中提到過,b就是指向a陣列的乙個指標,指標變數相對於c++內其他變數最大的乙個優勢就是可以在函式裡修改函式外的值
執行結果
可以看到a陣列內的值已經被改掉了
當然這段**也可以這麼寫
voidf(
int*b)
執行結果和上述用陣列作為函式變數完全一樣(尤其注意,由於傳入的陣列實際上是指標,b中不用寫入數字)
陣列變數是特殊的指標
陣列本身表達位址,所以
1.int a[10]; int *p=a;//無需&取位址
2.陣列的單元表達的是變數,要用&取位址
3.a==&a[0];
運算子可以對陣列做,也可以對指標做
*運算子可以對指標做,也可以對陣列做
特別注意:陣列變數不能被賦值(陣列變數屬於常量指標)
#include
#include
#include
using
namespace std;
voidf(
int*b)
intmain()
;//printf("%p\n",&a[0]);
f(a);*
(a+1)=
10;//以指標的方式寫的**也可以修改陣列內的值
for(
int i=
0;i<
10;i++
)printf
("%d "
,a[i]);
return0;
}
執行結果
附三道雲班課例題
這裡的*p=a相當於p=a[0],p指向了a的第一行的第一列位址
*a 是列指標,*p也是列指標,p[1]相當於列往後移動一格
解析:定義了乙個行指標,指向了a,指向了第0行的位址,p[1]是列指標,指向第2行第0列的位址,取 " * "變成了值
C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
指標與陣列的關係
指標與陣列的關係 指標與陣列是c語言中很重要的兩個概念,它們之間有著密切的關係,利用這種關係,可以增強處理陣列的靈活性,加快執行速度,本文著重討論指標與陣列之間的聯絡及在程式設計中的應用。1 指標與陣列的關係 當乙個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如 char str 20 p...
指標與陣列的關係
指標與陣列是c語言中很重要的兩個概念,它們之間有著密切的關係,利用這種關係,可以增強處理陣列的靈活性,加快執行速度,本文著重討論指標與陣列之間的聯絡及在程式設計中的應用。1 指標與陣列的關係 當乙個指標變數被初始化成陣列名時,就說該指標變數指向了陣列。如 char str 20 ptr ptr st...