C 7 2 5陣列做實參 避免越界

2021-07-02 19:56:44 字數 1420 閱讀 3048

有三種常見的程式設計技巧確保函式的操作不超出陣列實參的邊界。

void printvalues(const

int *beg,const

int *end)

int main();

printvalues(j,j+2);//j指向陣列的第乙個元素,j+2指向陣列最後乙個元素的下乙個位置

return

0;}

將被呼叫函式的第二個形參定義為表示陣列的大小。

void printvalues(const

int ia,size_t size)

}int main()

;printvalues(j,sizeof(j)/sizeof(*j));節上,sizeof(陣列名)求的是整個陣列的所有元素占有的記憶體大小。

//sizeof(*j)=sizeof(j[0])=sizeof(int型別的數)=4

return

0;}

習題7.12 什麼時候使用指標形參?什麼時候使用引用形參?解釋兩者的優缺點。

當函式需要處理陣列且函式體不依賴於陣列的長度時應使用指標形參,其他情況下應該使用引用形參;

指標形參的優點是可以明確地表示函式所操縱的是指向陣列元素的指標,而不是陣列本身,而且可以使用任意長度的實參陣列來呼叫函式(而引用形參是實參和形參必須對應);

指標形參的缺點是函式體不能依賴於陣列的長度,否則容易造成陣列記憶體的越界訪問,從而產生錯誤的結果或者導致程式崩潰;

引用形參的優點是在函式體中依賴陣列的長度是安全的,缺點是限制了可以傳遞的實參陣列,只能使用長度匹配的實參陣列來呼叫函式(就是實參)。

//習題 7.13 計算陣列元素之和。要求編寫函式三次,每次以不同的方法處理陣列邊界

int sum1(const int *begin,const int * end)

return

sum;

}int sum2(const int ia,size_t size)

return

sum;

}int sum3(int *begin,size_t size)

return

sum;

} int main();

cout<4)<4)<4)0;}

//習題7.14

double vectorsum(vector

::iterator begin,vector

::iterator end)

return sum;

} int main()

重做16周專案1指標做形參,陣列名做實參

編號及 完成日期 2014年12月23日 版本號v1.0 問題描述 指標的運用 問題輸入 無 問題輸出 排序輸出 include using namespace std void sort int p,int num 不要對自定義函式的宣告有任何改動 void output int int 形式引數...

C 結構體指標做函式引數不會改變實參的值

參考 在做一道經典的深度優先搜尋二叉樹的題目時遇到乙個問題,即c 中將結構體指標作為引數傳遞時,並不會改變實參的值!原因是當結構體指標傳遞給函式時,會拷貝乙份指標的值,但是函式內部的指標和函式外部的指標並不是指向同乙個引用的,所以才會使得函式裡面改變了,但是函式外部無變化,解決方案是在傳參的時候,將...

C語言中用陣列名作為引數能改變實參陣列的值的理解

很多初學者不理解為什麼c語言中用陣列名作為引數能改變實參陣列的值,現在來談談我的理解 把實參陣列傳遞給函式,則形參從陣列 得到了其實位址,因此陣列與實參陣列共佔了同一段記憶體單元,在函式呼叫期間,該變了形引數組的值,也就改變了實參陣列的值。現在問題來了,怎麼理解共占同一段記憶體單元和值改變造成的影響...