第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將數(shù)組和數(shù)組指針傳遞給C中的函數(shù)之間的區(qū)別

將數(shù)組和數(shù)組指針傳遞給C中的函數(shù)之間的區(qū)別

C
開(kāi)心每一天1111 2019-10-12 07:07:27
將數(shù)組和數(shù)組指針傳遞給C中的函數(shù)之間的區(qū)別C中兩個(gè)函數(shù)有什么區(qū)別?void f1(double a[]) {    //...}void f2(double *a) {    //...}如果我要在一個(gè)相當(dāng)長(zhǎng)的數(shù)組上調(diào)用這些函數(shù),這兩個(gè)函數(shù)的行為會(huì)不同,它們會(huì)占用更多的空間嗎?
查看完整描述

3 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

首先,一些標(biāo)準(zhǔn)

6.7.5.3函數(shù)聲明符(包括原型)
... 
7參數(shù)聲明為'' 類(lèi)型數(shù)組''應(yīng)調(diào)整為''限定指向 類(lèi)型 '',其中類(lèi)型限定符(如果有)是指定的那些內(nèi)的[]所述陣列型推導(dǎo)。如果關(guān)鍵字static也出現(xiàn)在數(shù)組類(lèi)型派生的[]中,那么對(duì)于每次對(duì)函數(shù)的調(diào)用,相應(yīng)的實(shí)際參數(shù)的值應(yīng)該提供對(duì)數(shù)組的第一個(gè)元素的訪問(wèn),其中至少有與該大小指定的元素一樣多的元素。表達(dá)。

因此,簡(jiǎn)而言之,任何函數(shù)參數(shù)聲明T a[]T a[N]進(jìn)行處理,就好像它被宣布T *a。

那么,為什么數(shù)組參數(shù)被視為聲明為指針?原因如下:

6.3.2.1左值,數(shù)組和功能指示器
... 
3除了當(dāng)它是的操作數(shù)sizeof操作者或一元&運(yùn)算符,或者是用于初始化數(shù)組文本的字符串,其具有輸入“”的陣列的表達(dá)類(lèi)型 ' '被轉(zhuǎn)換成類(lèi)型的表達(dá)式‘’指針鍵入指向陣列對(duì)象的初始元素,不是左值‘’。如果數(shù)組對(duì)象具有寄存器存儲(chǔ)類(lèi),則行為未定義。

給出以下代碼:

int main(void){
  int arr[10];
  foo(arr);
  ...}

在調(diào)用中foo,數(shù)組表達(dá)式arr不是任何一個(gè)sizeof或的操作數(shù)&,因此根據(jù)6.2.3.1/3 ,它的類(lèi)型從“10元素?cái)?shù)組int” 隱式轉(zhuǎn)換為“指向int”。因此,foo將接收指針值,而不是數(shù)組值。

因?yàn)?.7.5.3/7,你可以寫(xiě)foo

void foo(int a[]) // or int a[10]{
  ...}

但它將被解釋為

void foo(int *a){
  ...}

因此,這兩種形式是相同的。

6.99.5.3/7中的最后一句是用C99引入的,基本上意味著如果你有一個(gè)參數(shù)聲明

void foo(int a[static 10]){
  ...}

對(duì)應(yīng)的實(shí)際參數(shù)a必須是一個(gè)至少包含 10個(gè)元素的數(shù)組。



查看完整回答
反對(duì) 回復(fù) 2019-10-13
?
慕村9548890

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊

差異純粹是語(yǔ)法上的。在C中,當(dāng)數(shù)組表示法用于函數(shù)參數(shù)時(shí),它會(huì)自動(dòng)轉(zhuǎn)換為指針聲明。

查看完整回答
反對(duì) 回復(fù) 2019-10-13
?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

不,他們之間沒(méi)有區(qū)別。為了測(cè)試我在Dev C ++(mingw)編譯器中編寫(xiě)了這個(gè)C代碼:


#include <stdio.h>


void function(int* array) {

     int a =5;

}


void main() {  

     int array[]={2,4};

     function(array);

     getch();

}

當(dāng)我在IDA中的兩個(gè)調(diào)用版本的二進(jìn)制文件的.exe中反匯編主函數(shù)時(shí),我得到完全相同的匯編代碼,如下所示:


push    ebp

mov     ebp, esp

sub     esp, 18h

and     esp, 0FFFFFFF0h

mov     eax, 0

add     eax, 0Fh

add     eax, 0Fh

shr     eax, 4

shl     eax, 4

mov     [ebp+var_C], eax

mov     eax, [ebp+var_C]

call    sub_401730

call    sub_4013D0

mov     [ebp+var_8], 2

mov     [ebp+var_4], 4

lea     eax, [ebp+var_8]

mov     [esp+18h+var_18], eax

call    sub_401290

call    _getch

leave

retn

所以這個(gè)調(diào)用的兩個(gè)版本沒(méi)有區(qū)別,至少編譯器會(huì)同等地威脅它們。



查看完整回答
反對(duì) 回復(fù) 2019-10-13
  • 3 回答
  • 0 關(guān)注
  • 404 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)