c++數(shù)組傳參
最近感覺(jué)老是碰到數(shù)組傳參的問(wèn)題,特別是二維的數(shù)組,每次報(bào)錯(cuò)都感覺(jué)頭疼,煩躁;這里必須總結(jié)一下了,先把暫時(shí)能解決的問(wèn)題寫(xiě)在這吧,以便以后碰到查看!
先看一個(gè)一維數(shù)組傳參:這樣用數(shù)組傳參是很不安全的;會(huì)輸出亂碼。原因是函數(shù)返回的是一個(gè)數(shù)組,其保存的字符串" "存儲(chǔ)在棧中,函數(shù)結(jié)束后存儲(chǔ)該字符串的內(nèi)存(也就是棧上的內(nèi)存)被編譯器自動(dòng)釋放了。
恩今天3-21;遇到了一個(gè)新的問(wèn)題比較有意思;關(guān)于數(shù)組。
void print_1 (int n, int *a ) { //for(int i=0;i<n;i++){ a[n]={1,2,3};//為什么數(shù)組不允許這么賦值? } } int main(){ int n=3; int datas[n]={0}; print_1(n, datas); for (int i = 0; i < n; ++i) cout << datas[i] << " "; return 0; }
編譯器報(bào)的錯(cuò):error: cannot convert '<brace-enclosed initializer list>' to 'int' in assignment
因?yàn)樵趍ain()里,已經(jīng)對(duì)datas這個(gè)數(shù)組初始化了,那么datas這個(gè)數(shù)組名作為一個(gè)指針,已經(jīng)指向了內(nèi)存中的一個(gè)位置,so不能再次對(duì)它初始化,所以只能用循環(huán)語(yǔ)句
給它賦值,讓他指向新的內(nèi)存單元。
#include<iostream> using namespace std; #define A 5 char * init_code(){//聲明是這樣的; char list[A]={'a','b','c','d','e'}; return list;//這樣是沒(méi)問(wèn)題的,它傳的只是list這個(gè)指針的地址,并不會(huì)傳這個(gè)數(shù)組的大小; } int main(){ char *tt=init_code();//調(diào)用時(shí)是這樣的; for(int i=0;i<A;i++){//這里定義了地址之后的大小; cout<<tt[i]<<endl;//在函數(shù)中是這樣的; } return 0; }

二維數(shù)組的傳參:
#include<iostream> using namespace std; typedef char(*R)[3];//定義二維數(shù)組R類(lèi)型 R func(){ char list[2][3];//這里的char還不能寫(xiě)為R; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ list[i][j]='a'; } } return list; } int main(){ R x=func();//此時(shí)x是二維數(shù)組類(lèi)型的,將返回值付給他; for(int i=0;i<2;i++){ for(int j=0;j<3;j++){ cout<<x[i][j];//如此調(diào)用 } cout<<endl; } return 0; }

一維數(shù)組的調(diào)用方法上邊那個(gè)是不對(duì)的,正確的應(yīng)該是下邊:
void print_1 (int n, int *datas ) { for (int i = 0; i < n; ++i) { cout << datas[i] << " "; } cout << endl; } int main(){ const int N = 3; int datas[N] = {1, 2, 3}; print_1 (N, datas); return 0; }
或者這樣:
template<int N>//模板是個(gè)好東西,可以讓傳入的參數(shù)的類(lèi)型變?yōu)橐粋€(gè)變 //值,從而簡(jiǎn)化代碼冗余 void print_4 (int (&datas)[N]) { for (int i = 0; i < N; ++i) { std::cout << datas[i] << " "; } std::cout << std::endl; } int main(){ const int N = 3; int datas[N] = {1, 2, 3}; print_4 (datas); int datas2[N - 1] = {1, 2}; print_4 (datas2); }
posted on 2017-03-18 16:15 timleee 閱讀(2181) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)