程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言學習筆記(一):數組傳遞時退化為指針,語言學習指針

C語言學習筆記(一):數組傳遞時退化為指針,語言學習指針

編輯:關於C語言

C語言學習筆記(一):數組傳遞時退化為指針,語言學習指針


這幾天閒來無事,寫了一個數組元素排序函數如下:

#include <stdio.h>
#include <stdlib.h>
void ArraySort(int array[]); //數組元素從小到大排序

void ArraySort(int array[])
{
    int x,y,tmp;
    int i = sizeof(array) / 4; //獲取數組長度為i
    for(x=0;x<i;x++)
    {
        for(y=x;y<i;y++)
        {
            if (array[x] > array[y])
                {
                    tmp = array[x];
                    array[x] = array[y];
                    array[y] = tmp;
                }
        }
     }      
     printf("從小到大排序:");
     for(x=0;x<i;x++)
     {
         printf("%d\t",array[x]);
     }
}


int main(void)
{
    int a[]={99,66,33,2,5,61,6};
    ArraySort(a);
    system("pause");
    return 0;
}

仔細檢查一遍,沒有warning沒有error,應該可以實現排序的功能。結果呢:

問題來了,怎麼只有一個呢?

第一反應就是 i 出現了問題,於是我查看了一下 i 的值:

這是什麼原因呢? int i = sizeof(a) / 4;明顯沒有成功獲取到數組的長度,sizeof(a)獲取數組a的占用內存的字節 再除以每個int占用的字節(4)本該完全正確的! WTF?什麼鬼!

本屌覺得不服,於是又重寫了一段測試sizeof獲取數組長度的代碼:

#include <stdio.h>

int main(void)
{
    int array[] = {5, 4, 66, 23, 11, 44, 22, 361};
    int i = sizeof(array)/4;
    printf("數組長度為:%d\n", i);
    return 0;
}

編譯運行後結果居然是這個樣子的!!!

可見問題不是出在sizeof那裡 我在思考是不是出現在函數實參與形參那裡!

為什麼在函數外可以獲取,在函數裡就不行?!

 

最後的結果就是我找到了這個:

 

If you want to pass a single-dimension array as an argument in a function, you would have to declare function formal parameter in one of following three ways and all three declaration methods produce similar results because each tells the compiler that an integer pointer is going to be received.

意思大概為傳遞一維數組時,編譯器傳遞的不是數組,而是指針!

 

好吧!是在下輸了,以此篇文章警示像我一樣剛學習C語言的小白們在函數中傳遞數組的時候一定注意要在外面測數組長度,否則將會出BUG!

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