免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

C語(yǔ)言數(shù)組當(dāng)參數(shù)傳遞

 華燈初放l 2018-08-27

在學(xué)習(xí)C語(yǔ)言的過(guò)程中遇到數(shù)組作為參數(shù)傳遞的問(wèn)題

一維數(shù)組:

  1. #include <stdio.h>
  2. int test2(int a[]){
  3. for(int i=0;i<5;i++){
  4. printf("%d",a[i]);
  5. }
  6. }
  7. int main(){
  8. int a[5] = {1,2,3,4,5},*p;
  9. p = a;
  10. test2(a);
  11. }


這樣我們可以很順利的在test去遍歷這個(gè)數(shù)組a,當(dāng)然我們還可能傳遞指針:

  1. int test1(int *p){
  2. for(int i=0;i<5;i++){
  3. printf("%d",p[i]);//我們?cè)谶@里還可以用)*(p+i)來(lái)輸出數(shù)組中的值
  4. }
  5. }
  6. int main(){
  7. int a[5] = {1,2,3,4,5},*p;
  8. p = a;
  9. test1(p);
  10. }


一般來(lái)數(shù)參數(shù)的傳遞是值傳遞,也就是說(shuō)實(shí)參傳給形參,形參發(fā)生改變時(shí)實(shí)參并不會(huì)改變,(單向)但是數(shù)組在傳遞的時(shí)候是地址傳遞,只要形參發(fā)生了變化,實(shí)參也會(huì)發(fā)生變化(雙向)。

這樣傳遞數(shù)組就會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,我沒(méi)有辦法獲取到數(shù)組的長(zhǎng)度。獲取數(shù)組的長(zhǎng)度我們一般用:

sizeof(a)/sizeof(int)

  1. int test2(int a[]){
  2. int n = sizeof(a)/sizeof(int);
  3. for(int i=0;i<n;i++){
  4. printf("%d ",a[i]);
  5. a[i]++;
  6. }
  7. }
我們會(huì)發(fā)現(xiàn)n的值一直是2!為什么會(huì)這樣呢???
因?yàn)?,a是函數(shù)參數(shù),到了本函數(shù)中,a只是一個(gè)指針(地址,系統(tǒng)在本函數(shù)運(yùn)行時(shí),是不知道a所表示的地址有多大的數(shù)據(jù)存儲(chǔ)空間,這里只是告訴函數(shù):一個(gè)數(shù)據(jù)空間首地址),所以,sizoef(a)的結(jié)果是指針變量a占內(nèi)存的大小,一般在64位機(jī)上是8個(gè)字節(jié)。int類(lèi)型是4個(gè)字節(jié),所以,結(jié)果永遠(yuǎn)是2,因此,我們要向獲取數(shù)組長(zhǎng)度要怎么辦呢?

我可以在初始化數(shù)組的地方獲取到數(shù)組的長(zhǎng)度,作為參數(shù)傳遞過(guò)來(lái):

  1. int test2(int a[],int n){
  2. for(int i=0;i<n;i++){
  3. printf("%d ",a[i]);
  4. a[i]++;
  5. }
  6. }
  7. int main(){
  8. int a[5] = {1,2,3,4,5},*p;
  9. int n = sizeof(a)/sizeof(int);
  10. test2(a,n);
  11. }

這樣做我們可以獲取到數(shù)組的長(zhǎng)度。

二維數(shù)組:

二維數(shù)組作為參數(shù)傳遞是后我們不可以像以為數(shù)組那樣直接,如:

  1. void test1(int a[][]){
  2. for(i = 0; i < 5; i++){
  3. for(j = 0; j < 5; j++){
  4. printf("%d ",a[i][j]);
  5. }
  6. }
  7. }
  8. int main(){
  9. int a[5][5],i,j;
  10. for(i = 0; i < 5; i++){
  11. for(j = 0; j < 5; j++){
  12. a[i][j] = i*5 + (j +1);
  13. }
  14. }
  15. test1(a);
  16. return 0;
  17. }

會(huì)發(fā)現(xiàn)編譯都編譯不通過(guò),報(bào)“[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first”這個(gè)錯(cuò),意思是多維數(shù)組的定義必須有一個(gè)除第一個(gè)之外的所有維度的邊界,比如:

  1. void test1(int a[][5]){
  2. for(int i = 0; i < 5; i++){
  3. for(int j = 0; j < 5; j++){
  4. printf("%d ",a[i][j]);
  5. }
  6. }
  7. }
這樣就OK了,但是我們是動(dòng)態(tài)分配的數(shù)組不知道這個(gè)維度是多少的時(shí)候怎么辦?這時(shí)候我們可以用指針當(dāng)做一維數(shù)組來(lái)操作:
  1. void test1(int *p,int n){
  2. for(int i = 0; i < n; i++){
  3. printf("%d ",p[j]);
  4. }
  5. }
  6. int main(){
  7. int a[5][5],i,j;
  8. int *p;
  9. p = &a[0][0];
  10. for(i = 0; i < 5; i++){
  11. for(j = 0; j < 5; j++){
  12. a[i][j] = i*5 + (j +1);
  13. }
  14. }
  15. test1(p,25);
  16. return 0;
  17. }


這樣我們發(fā)現(xiàn)不能更靈活的去定位到某一行某一列,這樣我們需要手工改變尋址方式:
  1. void test2(int m,int n,int **p){//m,n是行和列,
  2. for(int i = 0; i < m; i++){
  3. for(int j = 0; j < n; j++){
  4. printf("%d ",*((int *)p+n*i+j));
  5. }
  6. }
  7. }
  8. int main(){
  9. int a[5][5],i,j;
  10. for(i = 0; i < 5; i++){
  11. for(j = 0; j < 5; j++){
  12. a[i][j] = i*5 + (j +1);
  13. }
  14. }
  15. test2(5,5,(int **)a);
  16. return 0;
  17. }







    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多