C語言,為什麼int a的傳遞引數是這樣的

時間 2021-09-07 13:28:16

1樓:匿名使用者

a[4]作為引數,傳遞的是陣列第五個元素(雖然你這個陣列裡沒有)的值。

a作為引數,是將陣列a的首地址傳遞過去,類似於指標。

2樓:匿名使用者

void func(int a)

你可以暫時看做等同於void func(int *a)需要的是一個陣列的首地址

陣列名即為陣列的首地址

a[0] a[1] 等等都是取值 而非地址以你的定義來看 a[4]是訪問非法地址,你只分配4個空間卻訪問第5個值,任何時候這種寫法都是不允許的

3樓:今生白度

看到void func(int a)函式的形參為一個陣列,也就是傳入的是一個陣列;

呼叫時,傳入的實參為陣列int a[4]=的陣列名,是把a[4]=這個陣列的首地址傳入函式;

只要傳入了陣列的首地址,那麼就可以對陣列的成員訪問了;

4樓:

int a[4]= //表示 a[0]=1;a[1]=2;a[2]=3;a[3]=4; a[4]是沒值的。使用a[4]會段錯誤

void func(int a) //表示傳入的是陣列的頭地址

所以func(a) //a就是陣列a的頭地址。

5樓:匿名使用者

因為a[4]只代表陣列a的第5個元素,而你這裡是想要對整個陣列進行操作,

a,就是整個陣列的代名詞。

6樓:匿名使用者

1、用陣列元素a[i]作實參時,向形參變數傳遞的是陣列元素的值,用陣列名a作函式實參時,傳遞的是陣列首元素的地址。

2、傳指標:傳「指標物件的值」,即傳的是變數的地址,只需要對這個指標物件進行拷貝,而不必拷貝指標所指物件的值;而這個時候,地址的傳遞也是值傳遞的形式,正是前面說到的對指標進行拷貝。

傳引用:在語言層面上講是傳資料/物件本身,不會引起任何拷貝。從編譯器實現的層面上講,很可能就是通過「傳指標」來實現的

c語言程式,用陣列名傳遞引數的時候,出現下面兩個問題,

7樓:匿名使用者

實踐出真知 譚大爺的書上有講到

呼叫函式時傳入的實參為陣列名,被函式形參定義為陣列,實際在被調函式中這個形引數組名其實只是看上去是個陣列名而已其實只是個實引數組的首地址)

8樓:

你對陣列名和bai

指標瞭解的還不透du徹。

mo(int a);

a 一維陣列zhi在函式引數中dao 等價於int* 。a是int指標。sizeof(a) 就是指版針大小和權*a 大小正好相等。

所以傳遞陣列必須有兩個引數一個是指標 一個是元素個數。

mo(int*a,unsigned int n);

而在t1 函式中 a 是陣列名,a的型別是陣列型別。

想知道詳情 你去搜一下 陣列名和指標區別

和 陣列 函式引數

c語言中,自定義函式可以使用全域性變數,為什麼還要傳遞給函式一些引數呢?

9樓:匿名使用者

1. 一個函式不可能總處於被呼叫狀態,在它沒被呼叫的時候也要給他分配一個全域性變數豈不是浪費。

2. 一個函式不一定同時只被呼叫一次。最簡單的例子就是一個函式自己呼叫自己的情況。另外一個最簡單的例子就是多執行緒的情況。

10樓:自由心魔

我和你一樣是新手,但是我看了很多也做了很多全域性變數最好是少用,你想啊,你這裡定義了一個全域性變數,在這個函式中改了一下,另外的一個函式中又改了一下,用的少了還行,用的多了呢,你知道最後一次是誰給改的嗎

在說寫對的話,**很難讀

你上面的想法完全正確,可以用,但是那程式太簡單了,沒多大意義,所以作為練習是可以的,學習的過程和使用的過程差距很大啊,我一個新手總結的

呵呵一起學習

11樓:lao辜

主函式跟自定義函式有時候會出現變數重複呼叫,最好分別定義

12樓:匿名使用者

當你的程式有上百個變數的時候,你就體會到區域性變數的作用了

13樓:不是很無知

如果把所有的變數都設定為全域性變數,有很多弊端:

1.浪費記憶體。知道程式結束之前全域性變數申請的記憶體是不會釋放的。

2.名字空間汙染,所有的變數都在同一個名字空間下,比如你用一個i來做迴圈控制,那麼你在全域性變數控制的時候就要i,ii,iii,可讀性差。也沒有必要。

3.有些變數是不希望被其他函式看到和控制的,但是全域性變數的作用域是整個程式。

建議看些程式設計思想方面的書,或者學些物件導向,你就不會有這樣的疑問了。真正的物件導向是不存在全域性變數的。

c語言指標引數傳遞為什麼我的程式崩潰?

14樓:

void real (int *pi)

有兩個問題:1,a是區域性變數,函式結束後就消失了,不能再引用2.編譯器會為函式的每個引數製作臨時副本,所以函式裡面的pi並不是真正的pi

這個函式改一下:

int a = 100 ;//定義到函式外部int *real(int *pi)

d = *real(b);//此時d = 100;

或者void real(int **pi)於是real(&b);

d = *b;//此時d = 100;

15樓:匿名使用者

錯誤原因,指標b沒有賦予初值,b指向**了?他是一個野指標。

把它作為函式的實參傳遞給函式real是有問題。

16樓:匿名使用者

因為你在使用b之前沒有給b賦值,b指向**了?他是一個野指標,有問題的。

17樓:

你這個a的生命週期只在real函式體中,函式結束,a就被釋放了,pi指向的位置裡有什麼就不一定了、

C語言「檔案包含處理」中的引數傳遞問題

雖然在標頭檔案中和正常的程式檔案中的 沒有本質區別,但是強烈不建議你把實現 放在標頭檔案中,標頭檔案中一般只適合放需要對外界透露介面的函式宣告,公有預編譯定義 define 結構體以及類的宣告 非實現 公共型別 typedef 公共列舉 enum 這麼做的原因就是防止樓主所說的問題發生。在.c檔案中...

c語言中,帶引數的主函式,如何傳遞引數給它

不可能按值傳遞的,設想一下 type arr sizeof arr 為100萬了位元組,如果按照值傳遞,就要建立一個臨時變數temp也為100萬個位元組,效率豈不是太低了。再可能arr是堆記憶體,引數傳遞是要屬性相同,值相同,難道系統自行去new一段記憶體,這該使用者去釋放 還是系統自動 呢?在命令...

inta和inta的區別,c語言中int a,int a和int a什麼區別?

七彩虹科技 int a 5 這裡的a是行指標,指向的是一個5的陣列,那麼它的單一跨度為5,即a 1,那麼它指向的數值要從首地址向後移動5個位置 int a 5 這只是一個int陣列,a是它的首地址,a 1,那麼它就指向第二個數值。區別很明顯了。 沃杆妮釀 int a相當於引用 例如 int n 5 ...