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

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

數(shù)組類型-分配/用作功能參數(shù)的規(guī)則

數(shù)組類型-分配/用作功能參數(shù)的規(guī)則

C
呼如林 2019-11-02 14:16:04
當(dāng)我需要將數(shù)組傳遞給函數(shù)時(shí),該函數(shù)的以下所有聲明似乎都可以使用void f(int arr[])  void f(int arr[4]) // is this one correct?為了這:int a[]={1,2,3,4};f(a);但是當(dāng)我將一個(gè)數(shù)組分配給另一個(gè)數(shù)組時(shí),它失敗了int a[]={1,2,3,4};int b[4] = a; // error: array must be initialized with a brace-enclosed initializer那么為什么將數(shù)組作為函數(shù)的參數(shù)傳遞卻可以,但是在簡(jiǎn)單賦值的rhs上使用卻是錯(cuò)誤的呢?
查看完整描述

3 回答

?
桃花長(zhǎng)相依

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

為了理解差異,我們需要了解兩種不同的情況。


在值上下文中,type數(shù)組的名稱T等效于type 的指針T,并且等于指向數(shù)組第一個(gè)元素的指針。

在對(duì)象上下文中,類型數(shù)組的名稱T不簡(jiǎn)化為指針。

什么是對(duì)象上下文?


在中a = b;,a是在對(duì)象上下文中。當(dāng)您獲取變量的地址時(shí),將在對(duì)象上下文中使用它。最后,當(dāng)sizeof在變量上使用運(yùn)算符時(shí),將在對(duì)象上下文中使用它。在所有其他情況下,在值上下文中使用變量。


現(xiàn)在我們有了這些知識(shí),當(dāng)我們這樣做時(shí):


void f(int arr[4]);

它正好相當(dāng)于


void f(int *arr);

如您所知,我們可以從函數(shù)聲明中忽略大小(上面為4)。這意味著您無(wú)法知道傳遞給的“數(shù)組”的大小f()。稍后,當(dāng)您這樣做時(shí):


int a[]={1,2,3,4};

f(a);

在函數(shù)調(diào)用中,名稱a位于值上下文中,因此將其簡(jiǎn)化為的指針int。這很好,因?yàn)閒需要指向的指針int,所以函數(shù)定義并使用match。傳遞給的f()是指向a(&a[0])第一個(gè)元素的指針。


如果是


int a[]={1,2,3,4};

int b[4] = a;

該名稱b在對(duì)象上下文中使用,并且不會(huì)簡(jiǎn)化為指針。(順便說(shuō)一下,a這里是在值上下文中,并簡(jiǎn)化為指針。)


現(xiàn)在,int b[4];分配4 ints的存儲(chǔ)時(shí)間并為其命名b。 a還被分配了類似的存儲(chǔ)空間。因此,實(shí)際上,上述分配表示“我要使存儲(chǔ)位置與先前的位置相同”。這沒(méi)有道理。


如果要將內(nèi)容復(fù)制a到中b,則可以執(zhí)行以下操作:


#include <string.h>

int b[4];

memcpy(b, a, sizeof b);

或者,如果你想要一個(gè)指針b是指向a:


int *b = a;

在這里,它a是在value上下文中,并簡(jiǎn)化為的指針int,因此我們可以分配a給int *。


最后,在初始化數(shù)組時(shí),您可以為其分配顯式值:


int a[] = {1, 2, 3, 4};

在這里,a有4個(gè)元素,分別初始化為1、2、3和4。您也可以這樣做:


int a[4] = {1, 2, 3, 4};

如果列表中的元素?cái)?shù)少于數(shù)組中的元素?cái)?shù),則其余值將取為0:


int a[4] = {1, 2};

將a[2]和設(shè)置a[3]為0。


查看完整回答
反對(duì) 回復(fù) 2019-11-02
?
慕姐4208626

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

void f(int arr[]);

void f(int arr[4]);

語(yǔ)法具有誤導(dǎo)性。它們都與此相同:


void f(int *arr);

即,您正在傳遞一個(gè)指向數(shù)組開(kāi)頭的指針。您不復(fù)制陣列。


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

添加回答

舉報(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)