程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 數組長度 以及 數組名作為參數 傳遞給函數,數組函數

C++ 數組長度 以及 數組名作為參數 傳遞給函數,數組函數

編輯:C++入門知識

C++ 數組長度 以及 數組名作為參數 傳遞給函數,數組函數


在看排序,首先是插入排序,思路理清後想用代碼實現,然後問題來了:

  如何求數組長度?

如果沒記錯,在Java中應該是有直接可用的方法的, Python中(序列)也有.len,在C/C++中,字符串倒是有strlen() (需要#include <string.h>)


一個辦法是用 sizeof()

一、
首先定義數組
  int array[] = {18,10,15,7,1};

一開始想都沒想就直接在子函數裡面
int array_length(int a[]){
    int len = sizeof(a)/sizeof(a[0]);
    
    return len;
}
然而在主函數中調用的結果並不是5 ,而是8 。


如果把子函數中的代碼直接用到主函數中,則能得到正確的答案 5
#include <iostream>

int main(int argc, const char * argv[]) {    
    int array[]={18,10,15,7,1};
    int len = sizeof(array)/sizeof(a[0]);

    cout<<len<<endl;
}

改變數組元素數量和內容,還是這樣。比如數組元素增加到6個,如果用子函數,則還是得到8,如果在主函數中直接用sizeof(),則得到6

奇怪了,同樣的代碼,在main()裡面好好的,到了子函數裡面咋就不行了?


二、

這篇文章指出:
  參數的傳遞是將實參的值賦給形參。然而對於數組來說卻是一個例外,因為數組的數據太多了,將其一一賦值既麻煩又浪費空間,所以數組作為參數傳遞給函數的只是數組首元素的  地址,函數在需要用到後面元素時再按照這個地址和數組下標去查找。也就是說後面的元素根本沒到函數裡來,所以在函數裡求不出數組的大小也就不足為奇了。
/******因此寫形式參數時既可以
int array_length(int a[]){
    return 0;
}
*******/
/*******也可以
int array_length(int *a){
  return 0;
}
*******/


而此時(在子函數中)再用sizeof(a),則得到的是指針的長度(這裡“指針的長度”這個表述可能有問題,該怎麼精確表達呢?),由於是64位的機子,所以是8(字節)
(sizeof(a[0]) 還是4, 其中a[]是int型數組)

另一方面,在子函數中另外的操作,比如拿數組名當指針用的 a++,還是和main()裡面一樣
#include <iostream>

void length(int a[]){
    cout<<sizeof(a[0])<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
    cout<<*a++<<endl;
}

int main(int argc, const char * argv[]) {    
    int a[]={65,66,67,68,1,1,2,10,15,7,1}; 
    length(a);

    return 0
}

//輸出的結果是
//    4
//    65
//    66
//    67
輸出結果顯示,子函數內還是按照首地址以及數組類型的長度來遞增。
如果是排序,在子函數裡面修改了地址所對應的內容,主函數再調用的時候內容也已經變了,也就是對內存中的數據進行了操作,影響了實參。所以可以不用返回數組什麼的,直接用void 類型的子函數就好了。


最後,解決方案,還是如這篇文章所說:
一般是先在外面把數組長度算好了,再作為作為參數傳進去。

//至於用 宏定義 / 類 等方法,以後再研究
//再加一句,能用google就不要用度娘,搜索質量高的不是一點半點,省下的時間不是一點半點。



附:
1). mac如何顯示是 32位/64位機器:
2). 32位機指針為什麼是4個字節 64位與32位機的區別
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved