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 引數傳遞順序與自加運算的問題,int a 0 printfd d da,aa 的結果為434,請問為什麼

語句內部的自加 自減運算在不同的編譯平臺上的實現是各不相同的,這是因為ansi和iso都沒有給出具體要求,但當一個語句執行完成後,作為 附加效應 也必須完成,這是所謂的 時間點 可參閱 c缺陷與陷阱 剛根據你的問題做了一個測試,感覺很神奇 include void func int a,int b,...

c 中引數的傳遞 是什麼過程

簡單的說吧。引數傳遞 如果是按值傳遞 那麼物件到函式中就要被複製一次。如果是按引用傳遞 那麼只需複製物件的位址即可。對於c 來說。凡是結構 即struct定義的 全都用按值複製 如果在函式中改變那個引數 則實參不會改變。例如change char p 如果在change中p這個引數被改變了。那麼 c...

C 語言 int a是什麼定義啊

與非 是指標變數,簡單來說,指標變數中是儲存的變數地址,而不是變數的值。指標是c語言的精華部分,通過利用指標,我們能很好地利用記憶體資源,使其發揮最大的效率。有了指標技術,我們可以描述複雜的資料結構,對字串的處理可以更靈活,對陣列的處理更方便,使程式的書寫簡潔,高效,清爽。但由於指標對初學者來說,難...