亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么程序運行卻是正確的,請問這是什么情況?

為什么程序運行卻是正確的,請問這是什么情況?

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

2 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

這問題其實挺有趣的,對于argv來說,既然定義成

char *argv[]

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

我們知道數組名其實就是一個常量,是不能被直接修改的,這是它與指針一個最大的區別。

這里argv與arr最大的區別是一個是函數中的參數,一個是定義的局部變量。

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

一個方面,正如藍皮鼠所說的,main函數的原型中argv其實是

char **argv

這樣,對于定義成char * argv[]的參數,gcc在編譯時會有一個隱式轉換,因為這里這兩者是是相容的,就算你定義成

char const * argv[]

對于argv來說,這個定義就不相容了。不過一般會有兩個結果,要么編譯器很嚴格直接報錯,要么會給個警告信息,然后繼續把它當成 char **argv 來用。

所以你直接對argv進行左值運行,代碼可以被編譯通過,就正常了。

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

#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);

}

因為main函數是程序的入口函數,是被編譯內部定義好的,所以可以再定義一個

int func(char *v[])

結果發現這個v仍然可以進行左值操作。

上面說了參數中數組的傳遞有些特殊,因為在實際處理參數中的數組時,其實編譯器是把它當成一個指針來處理。

比如你定義好一個數組
`
char arr2[10];`

假定有一個函數,其原型如下:

int func2(char p[]);

那么當以下調用發生時:

func2(arr2);

arr2的值會被復制一份到一個內部局部變量指針(堆棧或寄存器)中,這個指針指向arr2[0]的位置。這樣arr就被傳遞進func2函數中了。

同時,這也是在定義函數的參數時,如果參數中有數組,我們一般不用在數組標記中間寫上數組長度值的原因,因為沒有意義,實際只是把數組的地址進行了傳遞。
比如:

'int func2(char arr[10])'

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


查看完整回答
反對 回復 2023-04-18
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

我覺得是這樣的

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

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

char const* argv[];

上面的聲明可以做自加運算應該是因為main函數的聲明是

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

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


查看完整回答
反對 回復 2023-04-18
  • 2 回答
  • 0 關注
  • 194 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號