指標作為引數傳遞的總結

2021-10-09 02:04:27 字數 1497 閱讀 7829

如下**,會出現編譯錯誤,使用mystrlen無法計算出char陣列的真實長度

//計算字元陣列的長度

size_t mystrlen(char *s)//無法計算出陣列的大小

//計算字元陣列的長度

size_t mystrlenconst(const char *s)//實參可以是常量也可以是陣列

return len;

}int main()

我們發現第乙個函式計算陣列長度錯誤

指標和陣列並不相等。當我們宣告乙個陣列時,它同時也分配了一些記憶體空間,用於容納陣列元素。但是,當我們宣告乙個指標時,它只分配了用於容納指標本身的空間。

當乙個陣列名作為引數傳遞給乙個函式時會發生什麼情況呢? 陣列名的值就是個指向陣列第1個元素的指標,所以很容易明白,此時傳遞給函式的是乙份該指標的拷貝。函式如果執行了下標引用,實際上是對這個指標執行間接訪問操作,並且通過這種間接訪問,函式可以訪問與修改程式中的陣列元素。

現在我可以解釋c關於引數傳遞的表面上的矛盾之處。我早先曾說過所有傳遞給函式的引數都是通過傳值方式進行的,但陣列名引數的行為卻彷彿它是通過傳址呼叫傳遞的。那是因為將陣列名作為引數傳遞時,它會拷貝乙份指標,該指標指向陣列的起始位置。

1、當函式的引數是乙個字串的時候,如果函式內部並不改變實參的值,那麼就把形參定義為cont char *,這樣函式的使用會更方便;

2、當乙個陣列名做為函式引數的時候,就丟失了陣列成員的數量了,你得傳入乙個長度;

3、vs2017不支援const char * 初始化 "char *"型別。可以先將字元使用字元陣列進行儲存,再使用指標

4、指標本身作引數傳遞和普通變數類似,拷貝傳值。

例子

int test(int array ,int len) 

return sum;

}int main()

; int sum = test(array,sizeof(array)/sizeof(int));

//printf("%d", sum);

int len = sizeof(array)/sizeof(int);

for (int i = 0; i < len; i++)

return 0;

}

在函式裡對它直接賦值只是改了形參指標的指向,並不會對外部實參指標有任何改變。如果你要修改形參指標原本指向的那一塊記憶體,而不能是指標之間直接賦值,正確的做法是把其它指標指向的一塊記憶體資料拷貝到形參指標指向的記憶體塊去,使用strcopy 函式

string::string(const string &other)  

參考:

指標作為引數傳遞

如果想通過函式呼叫得到n個要改變的值,可以採取下面的步驟 在主調函式中設n個變數,用n個指標變數指向它們 編寫被呼叫函式,其形參為n個指標變數,這些形參指標變數應當與主調函式中的n個指標變數具有相同的基型別 在主調函式中將n個指標變數作實參,將它們的值 是位址值 傳給所呼叫函式的n個形參指標變數,這...

指標作為函式引數傳遞

值傳遞,指標傳遞?這幾天在學習c過程中,在使用指標作為函式引數傳遞的時候出現了問題,根本不知道從何得解 源 如下 createnode binnode tree,char p 該 段的意圖是通過乙個函式建立乙個二叉樹的節點,然而在,呼叫該函式後,試圖訪問該節點結構體的成員時候,卻發生了記憶體訪問錯誤...

指標位址作為引數傳遞

在做gpu cuda 高效能計算時遇到乙個問題 host 中分配的gpu變數怎麼在 host 間傳遞。其實這轉換過來是乙個函式間指標型變數的傳參問題。指標本身也是乙個變數,裡邊儲存的是位址,如果需要在函式間傳遞可修改自身位址的指標 指標型變數 那麼有兩種方法實現。取該指標的位址,作為乙個新的指標傳遞...