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

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

為什么程序運(yùn)行卻是正確的,請(qǐng)問這是什么情況?

為什么程序運(yùn)行卻是正確的,請(qǐng)問這是什么情況?

C
精慕HU 2023-04-15 13:09:20
關(guān)于下面的程序:#include <stdio.h>main(int argc, char const* argv[]) {    char const* arr[]={"Hello","World","AndyXue"};     *++argv;     *++arr;  }運(yùn)行結(jié)果是:*++argv; //right *++arr;  //error在C語(yǔ)言中,數(shù)組名是不可以做自增運(yùn)算的,所有在第一次接觸到 *++argv時(shí),我感覺是錯(cuò)誤的,搞了半天我得出的結(jié)論是:char const* arr[]={"Hello","World","AndyXue"}; //該arr指向的是一個(gè)常量,所以不能更改。char const* argv[]//未被初始化,所以可以自增運(yùn)算 ,哎 這樣也解釋不通求解釋,求指導(dǎo)。
查看完整描述

2 回答

?
慕蓋茨4494581

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

這問題其實(shí)挺有趣的,對(duì)于argv來說,既然定義成

char *argv[]

那不就是說明argv是一個(gè)指向字符串的指針數(shù)組,怎么也能左值操作?

我們知道數(shù)組名其實(shí)就是一個(gè)常量,是不能被直接修改的,這是它與指針一個(gè)最大的區(qū)別。

這里argv與arr最大的區(qū)別是一個(gè)是函數(shù)中的參數(shù),一個(gè)是定義的局部變量。

一般可以從兩個(gè)方面來理解這個(gè)問題。

一個(gè)方面,正如藍(lán)皮鼠所說的,main函數(shù)的原型中argv其實(shí)是

char **argv

這樣,對(duì)于定義成char * argv[]的參數(shù),gcc在編譯時(shí)會(huì)有一個(gè)隱式轉(zhuǎn)換,因?yàn)檫@里這兩者是是相容的,就算你定義成

char const * argv[]

對(duì)于argv來說,這個(gè)定義就不相容了。不過一般會(huì)有兩個(gè)結(jié)果,要么編譯器很嚴(yán)格直接報(bào)錯(cuò),要么會(huì)給個(gè)警告信息,然后繼續(xù)把它當(dāng)成 char **argv 來用。

所以你直接對(duì)argv進(jìn)行左值運(yùn)行,代碼可以被編譯通過,就正常了。

另一方面,在C語(yǔ)言中,參數(shù)中的數(shù)組傳遞有些特殊。比如下面的代碼:

#include <stdio.h>int func(char *v[]){
	*++v;	printf("&v=%x\t v=%x\n",&v,v);
}int main(int argc, char const* argv[]){	char const* arr[]={"1","2","3"};	printf("&argv=%x\t argv=%x\n",&argv,argv);	printf("&argc=%x\t argc=%x\n",&argc,argc);	
	func(argv);

}

因?yàn)閙ain函數(shù)是程序的入口函數(shù),是被編譯內(nèi)部定義好的,所以可以再定義一個(gè)

int func(char *v[])

結(jié)果發(fā)現(xiàn)這個(gè)v仍然可以進(jìn)行左值操作。

上面說了參數(shù)中數(shù)組的傳遞有些特殊,因?yàn)樵趯?shí)際處理參數(shù)中的數(shù)組時(shí),其實(shí)編譯器是把它當(dāng)成一個(gè)指針來處理。

比如你定義好一個(gè)數(shù)組
`
char arr2[10];`

假定有一個(gè)函數(shù),其原型如下:

int func2(char p[]);

那么當(dāng)以下調(diào)用發(fā)生時(shí):

func2(arr2);

arr2的值會(huì)被復(fù)制一份到一個(gè)內(nèi)部局部變量指針(堆?;蚣拇嫫?中,這個(gè)指針指向arr2[0]的位置。這樣arr就被傳遞進(jìn)func2函數(shù)中了。

同時(shí),這也是在定義函數(shù)的參數(shù)時(shí),如果參數(shù)中有數(shù)組,我們一般不用在數(shù)組標(biāo)記中間寫上數(shù)組長(zhǎng)度值的原因,因?yàn)闆]有意義,實(shí)際只是把數(shù)組的地址進(jìn)行了傳遞。
比如:

'int func2(char arr[10])'

這就是我的理解和說明,希望對(duì)你有所幫助。


查看完整回答
反對(duì) 回復(fù) 2023-04-18
?
慕斯709654

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

我覺得是這樣的

char const* arr[]={"Hello","World","AndyXue"};

這個(gè)之所以不能做自加運(yùn)算,正如你所說這樣的初始化方式使得arr是一個(gè)指針數(shù)組,arr同時(shí)也是數(shù)組首地址,是常量不是左值,既然不是左值當(dāng)然也就不能做自加操作。而且這里容易被const修飾影響,雖然這在這里不是引起這個(gè)問題的原因,去掉還是不能編譯的。

char const* argv[];

上面的聲明可以做自加運(yùn)算應(yīng)該是因?yàn)閙ain函數(shù)的聲明是

int main(int argc, char **argv);

所以你現(xiàn)在使用的這種聲明被轉(zhuǎn)化了,雖然兩種表現(xiàn)形式是一樣的,但是前者是二維指針而非指針數(shù)組,也就可以做自加運(yùn)算。


查看完整回答
反對(duì) 回復(fù) 2023-04-18
  • 2 回答
  • 0 關(guān)注
  • 205 瀏覽

添加回答

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