指標形參,C程式設計必須懂的東西
函式的傳遞的引數是原引數的副本
使用C語言程式設計,不可能不用到函式,但是函式的引數傳遞,我們是否真的清楚了呢。本文主要介紹C語言中函式傳遞的引數。。
函式的引數通常分為兩種,普通變數,指標變數。這些引數,將會被函式體呼叫,當讓,也可以傳入一些永遠不被函式呼叫的引數,就像你宣告瞭一些變數,卻永遠不用一樣,在語法上是沒有問題的。
那麼,函式體內呼叫的傳遞過來的引數,與原來的引數有什麼關係呢?
函式體內接收到的引數,是原引數的副本。
1. 普通變數在函式中的傳遞
首先我們來看普通變數,函式體內的引數為該普通變數的拷貝副本。下面是一個例子的源程式:
#include <stdio.h> #include <stdlib.h>
int test(int t1, int t2);
int main(int argc, char *argv[]) { int t1 = 10; int t2 = 0;
printf("[main]t1: %d/tt1:%x/n", t1, &t1); printf("[main]t2: %d/tt2:%x/n", t2, &t2);
test(t1, t2);
printf("[main]t1: %d/tt1:%x/n", t1, &t1); printf("[main]t2: %d/tt2:%x/n", t2, &t2);
system("PAUSE"); return 0; }
int test(int t1, int t2) { printf("in func..../n");
printf("[test]t1: %d/tt1:%x/n", t1, &t1); printf("[test]t2: %d/tt2:%x/n", t2, &t2); t2 = t1; printf("[test]after t2 = t1/n"); printf("[test]t1: %d/tt1:%x/n", t1, &t1); printf("[test]t2: %d/tt2:%x/n", t2, &t2); printf("in func over..../n"); return 1; } |
執行結果為:
[main]t1: 10 t1:22ff7c [main]t2: 0 t2:22ff78 in func.... [test]t1: 10 t1:22ff60 [test]t2: 0 t2:22ff64 [test]after t2 = t1 [test]t1: 10 t1:22ff60 [test]t2: 10 t2:22ff64 in func over.... [main]t1: 10 t1:22ff7c [main]t2: 0 t2:22ff78 |
(列印的地址值可能與我獲得的結果不同。)
可以看到,t1和t2,在被test函式呼叫前後,其值和地址都未變化。而在test函式中,t1和t2的地址與main函式中並不相同,其只是原來的t1和t2的拷貝副本。對副本作的一切操作,都不會影響到test函式外的原來的引數。
2. 指標變數在函式中的傳遞
指標作為變數在函式傳遞中,有些特殊,對於普通變數,函式傳遞的是對其的一份拷貝的副本,而對於指標,函式傳遞的是對其存放地址的一份拷貝,該拷貝存放的地址與原來的指標所存的地址一致。
我們來看看例子程式:
#include <stdio.h> #include <stdlib.h>
int test(char *t1, char *t2);
int main(int argc, char *argv[]) { char t1[] = "kdsfkasdfkdsf"; char *t2 = NULL; printf("[main]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[main]t2: %s/tt2:%x/t/t&t2:%x/n", t2, t2, &t2); test(t1, t2); printf("[main]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[main]t2: %s/tt2:%x/t/t&t2:%x/n", t2, t2, &t2);
system("PAUSE"); return 0; }
int test(char *t1, char *t2) { printf("in func..../n"); printf("[test]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[test]t2: %s/tt2:%x/t/t&t2:%x/n", t2, t2, &t2); t2 = t1; printf("[test]after t2 = t1/n"); printf("[test]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[test]t2: %s/tt2:%x/t&t2:%x/n", t2, t2, &t2); printf("in func over..../n"); return 1; } |
輸出結果為:
[main]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff68 [main]t2: (null) t2:0 &t2:22ff64 in func.... [test]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff40 [test]t2: (null) t2:0 &t2:22ff44 [test]after t2 = t1 [test]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff40 [test]t2: kdsfkasdfkdsf t2:22ff68 &t2:22ff44 in func over.... [main]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff68 [main]t2: (null) t2:0 &t2:22ff64 |
(列印的地址值可能與我獲得的結果不同。)
可以看到,在main函式中,t1、t2所存放的地址,以及該地址對應的字串的值,與test函式中傳遞的t1、t2完全一樣,但t1、t2的地址卻完全不同,
l 故指標在函式中傳遞的是其地址的一份拷貝,可以在函式體內,修改指標存放的地址對應的值,其修改在函式體外對原引數同樣有效,因為原引數也指向該地址。
l 指標在函式體內可修改其所存放的地址,但其修改對函式體外原指標引數無效,因為其只是原指標引數的地址副本,原指標依然指向原來的地址。
3. 使用指標的指標在函式體內修改指標所指物件
如果一定要修改指標引數所指的地址,應該怎麼作呢?這時,我們需要用到指標的指標了。請看例子程式:
#include <stdio.h> #include <stdlib.h>
int test(char **t1, char **t2);
int main(int argc, char *argv[]) { char *t1 = "tttt"; char *t2 = NULL;
printf("[main]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[main]t2: %s/tt2:%x/t&t2:%x/n", t2, t2, &t2);
test(&t1, &t2);
printf("[main]t1: %s/tt1:%x/t&t1:%x/n", t1, t1, &t1); printf("[main]t2: %s/tt2:%x/t&t2:%x/n", t2, t2, &t2); //printf("[main]t2: %s/n", t2);
system("PAUSE"); return 0; }
int test(char **t1, char **t2) { printf("[test]in func..../n"); printf("[test]*t1: %s/tt1:%x/n", *t1, t1); printf("[test]*t2: %s/tt2:%x/n", *t2, t2); *t2 = *t1; printf("[test]after *t2 = *t1/n"); printf("[test]*t1: %s/tt1:%x/n", *t1, t1); printf("[test]*t2: %s/tt2:%x/n", *t2, t2);
printf("[test]in func over..../n"); return 1; } |
相關文章
- c程式設計--指標與陣列C程式程式設計指標陣列
- 強烈推薦:程式設計師必須懂的資料庫知識程式設計師資料庫
- Java程式設計師必須掌握的7個Java效能指標!Java程式設計師指標
- C語言指標應用程式設計C語言指標程式設計
- PTA - C程式設計 NoC - 指標 (11道題)C程式程式設計指標
- C++程式設計開發和指標的關係C++程式設計指標
- 必須懂的mysql知識MySql
- 找工作的程式設計師必懂的Linux程式設計師Linux
- 程式設計師必須要了解的web安全程式設計師Web
- shell程式設計必須要掌握的命令-xargs程式設計
- 程式設計師必須走向專業化程式設計師
- iOS 程式設計師必須收藏的資源大全iOS程式設計師
- 實驗5 C語言指標應用程式設計C語言指標程式設計
- Java程式設計師必須瞭解的7個效能指標,你都知道嗎?Java程式設計師指標
- 前端必須懂的計算機網路知識—(TCP)前端計算機網路TCP
- 前端必須懂的計算機網路知識—(HTTP)前端計算機網路HTTP
- C/C++中的實參和形參C++
- 你必須懂的前端效能優化前端優化
- @程式設計師,安全問題必須重視!程式設計師
- 程式設計師必須掌握的資料結構 2程式設計師資料結構
- Java程式設計師必須掌握的5個註解!Java程式設計師
- PHP程式設計師必須知道的兩種日誌PHP程式設計師
- 程式設計師必須掌握的資料結構 1程式設計師資料結構
- 成為更好的程式設計師必須學習的 4 種程式設計結構程式設計師
- CSS設定滑鼠指標形狀CSS指標
- c++形參實參C++
- Java程式設計師必須掌握的Spring依賴管理原理Java程式設計師Spring
- 程式設計師必須掌握的核心演算法有哪些?程式設計師演算法
- 程式設計師成為大佬必須學的演算法程式設計師演算法
- 程式設計師生存指南:你必須要掌握的兩點!程式設計師
- 聊聊程式設計師面試時,那些必須注意的事情程式設計師面試
- Python爬蟲需要學哪些東西?這些知識點必須掌握!Python爬蟲
- 購買低程式碼平臺,必須考慮的關鍵指標和注意事項指標
- 程式設計師程式設計必備名言佳句,提升裝逼指數~程式設計師
- 前端工程師必須掌握的設計模式前端工程師設計模式
- C語言必須要記住的經典程式C語言
- Java程式設計生涯你必須要了解的資料結構Java程式設計資料結構
- 【Linux常用命令①】程式設計師必須掌握的Linux命令Linux程式設計師
- C語言+圖形程式設計——自制象棋C語言程式設計