【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
文章目錄
- 一、問題描述
- 二、從編譯器角度分析該問題
- 三、數(shù)組作為參數(shù)的推薦方案
一、問題描述
將 數(shù)組 作為 函數(shù)參數(shù) , 傳遞時(shí)會(huì) 退化為指針 ;
數(shù)組的首地址 , 變?yōu)橹羔樀刂?, 函數(shù)中無(wú)法判定數(shù)組的大小 ;
代碼示例 :
#include <stdio.h>/** 數(shù)組作為參數(shù) 會(huì) 退化為指針*/ void fun(int array[3]) {printf("fun : sizeof(array)=%d\n", sizeof(array)); }/** 函數(shù)入口*/ int main(int argc, char **args) {// 將要作為實(shí)參的數(shù)組int array[3] = {1, 2, 3};printf("main : sizeof(array)=%d\n", sizeof(array));// 將數(shù)組作為參數(shù)傳遞到函數(shù)中fun(array);return 0; }執(zhí)行結(jié)果 :
二、從編譯器角度分析該問題
該問題的理解 , 需要從 C/C++ 編譯器的角度進(jìn)行理解 , 代碼開發(fā)出來(lái) , 主要是給編譯器使用的 , 讓編譯器明白開發(fā)者的意圖 ;
上述示例中 , 函數(shù)的 實(shí)參是
// 將要作為實(shí)參的數(shù)組int array[3] = {1, 2, 3};, 其類型是 int 數(shù)組 ; 函數(shù)的 形參是 void fun(int array[3]) 中的
int array[3]其類型是指針 ;
上述 實(shí)參的 array 與 形參的 array 數(shù)據(jù)類型不同 ,
編譯器將 形參的 array 當(dāng)做指針 , 只給該形參分配了 4 字節(jié)內(nèi)存 , 沒有為其分配 4 x 3 = 12 字節(jié)的內(nèi)存 ;
編譯器會(huì)將 形參中的數(shù)組 作為指針處理 , 只會(huì)為其分配 指針 所占用的內(nèi)存 ;
如果 編譯器 將 形參作為 數(shù)組處理 , 需要 將數(shù)組中的所有元素 , 都要拷貝到棧中 , 如果這個(gè)數(shù)組很大 , 有幾千上萬(wàn)個(gè)元素 , 那么該函數(shù)的執(zhí)行效率就很低了 ;
因此 , 為了提升 C 語(yǔ)言的執(zhí)行效率 , 參數(shù)傳遞時(shí) , 如果要傳遞大量數(shù)據(jù) , 不允許傳遞數(shù)組 , 只能傳遞指針 ;
C 語(yǔ)言的優(yōu)勢(shì) , 就是在 調(diào)用函數(shù) 之間 , 通過指針操作內(nèi)存 , 效率很高 , 因此 編譯器不允許使用數(shù)組作為參數(shù) ;
三、數(shù)組作為參數(shù)的推薦方案
形參設(shè)置為 數(shù)組元素類型的指針 , 以及數(shù)組元素個(gè)數(shù) ;
代碼示例 :
#include <stdio.h>/** 數(shù)組作為參數(shù) 會(huì) 退化為指針*/ void fun(int *array, int count) {int i;for(i = 0; i < count; i++)printf("%d ", array[i]); }/** 函數(shù)入口*/ int main(int argc, char **args) {// 將要作為實(shí)參的數(shù)組int array[3] = {1, 2, 3};printf("main : sizeof(array)=%d\n", sizeof(array));// 將數(shù)組作為參數(shù)傳遞到函數(shù)中fun(array, sizeof (array) / sizeof (array[0]));return 0; }執(zhí)行結(jié)果 :
總結(jié)
以上是生活随笔為你收集整理的【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 应用开发】Canvas
- 下一篇: 【C 语言】数据类型本质 ( 数据类型