c語言關於函式形參的問題,C語言函式的形參問題

時間 2022-03-08 15:10:37

1樓:匿名使用者

你可能對形參和實參有些混淆。為了說明清楚,將f函式的形參換個字母,不影響程式的正確性。

f(int *t)

在執行f(s)時,首先建立了一個臨時變數int *t,然後執行了賦值t=s。注意,s沒有受到任何改變。

現在,t指向了變數b。

然後,又建立了一個臨時變數a,他的值是5.

接著,令t=&a。所以t指向了變數a。

最後,*t=6。*t就是a,所以a的值變為6。

而到現在為止,s仍然沒有受到任何影響,s仍然指向b,而且b也沒有受到影響。

所以printf("%d",*s)輸出的就是b的值,當然是0.

2樓:

1 程式改正及分析:

#include

void f(int *s) //in改為int

void main()

2 程式輸出:0

3樓:匿名使用者

最後輸出0,因為:

s=&b;則s中存的b的地址

f(s);則把b的地址傳給了f(int *s)的形參s,注意,主函式中的s和形參s不一個s

f函式中,s=&a;則形參s的值變為a的地址,主函式中的s值沒變*s=6中,*s自然指的就是a了,所以a的值變為6,主函式中s和b的值都沒變

最後輸出的*s,自然指的是b,也就是0了。。。

4樓:匿名使用者

0在f函式中,s指向了a,改了地址,主函式中的b沒變,f呼叫完後,主函式中的s仍然指向b,值為零

c語言函式的形參問題

5樓:侃史小吏

值傳遞是單向傳遞。只能由實參傳給形參。而陣列傳遞的是陣列的首地址。不是變數的值。兩個陣列共佔同一段記憶體單元。所以。。。。。

6樓:

傳遞值得時候形參和實參不共用單元格,但是傳地址的時候他們共用一個單元格!~

7樓:匿名使用者

形參傳遞的是值,引數並且參與計算時,並沒有呼叫修改該引數,而是先把引數的值複製到記憶體的另一個地方,修改的是複製後的那個地址所對應的值,故原值不變。。而陣列a中,a其實質就是指標,指向的是該陣列第一個成員,參與計算時,相當於修改了實參,所以值會變得/

8樓:匿名使用者

首先要知道,引數傳遞是要壓棧的

簡單示意說明下

如 void test (int y)

這樣操作的

void test(int y)

意思是說函式中執行的實話,已經不是傳入的引數了,而是一個副本只修改了副本,y沒有改變

而傳指標

void test (int *y)

改_y地址的內容即是改y地址的內容

9樓:匿名使用者

引數傳遞中有些傳的是值,有些傳遞的是地址,陣列的話是傳遞的地址。

10樓:匿名使用者

因為陣列是不定長的,這導致沒法向函式正確傳遞陣列。

所以,如果是傳陣列的話,統一的只是傳遞陣列首地址,也就是指標,子函式裡通過該指標找到陣列裡的資料,所以修改裡面的數就是修改了原來的數。記住,陣列引數是傳指標來實現的

而一般引數則是直接把資料入棧,相當於把資料作了一份拷貝,把拷貝傳給了子函式

11樓:若影蝸牛

形參.在c中有兩種傳遞方式:數值傳遞和指標傳遞數值傳遞,就是你說的第一種情況,使用的是原資料的拷貝,而非原資料,一個簡單的例子:

void swap( int a , int b)在其他函式中呼叫swap(x,y).是不會交換x,y的值的指標傳遞:就是你說的第二種,陣列名是指標型別的..

學到後面你會明白,指標儲存的是資料的地址,你可以這麼理解,通過這個地址,可以找到實際的資料,對這塊地址進行間訪操作就可以操作實際的資料

void swap( int *a , int *b)呼叫swap(&x,&y) 可以交換x,y的值

12樓:匿名使用者

int clear(list *&l);中

list *&l 是一個指標引用, c語言中沒有引用的概念。這是c++的語法。

1) int clear(list *l); 傳入指標,能保留函式對l指向的記憶體所做的修改。指標l本身不會被改變,它仍指向同一塊記憶體。

2) int clear(list *&l); 傳入指標引用,能保留函式對l指向的記憶體所做的修改。與1)不同的是,指標本身也可以保留函式對它的改變,而去指向另一片記憶體

3) int clear(list l); 傳入結構變數的一個副本,所以,函式對引數l所做的修改,在函式退出後不會被保留。 l不會被改變。

另外,團idc網上有許多產品**,便宜有口碑

問個關於c語言中函式形式引數的問題

13樓:

const 修飾引數的時候表示只讀。你這邊是為了防止引數在函式執行過程中對其進行修改。

比如說我這個函式我這樣使用hanshu("123")這樣可不可以?

可以。那麼這個「123」是什麼型別?printf(」123「)的用法,是不是指標型別

"123"是一個字串,但是首地址是個char型的指標。

是不是形式引數定義成這樣必須傳入指標?

是的。那麼我要定義int cm(int *b); 這時候我這個函式傳入是不是要一個指向int型別的指標,而不能之間傳入int型別?

是的。比如: int a = 10;

你要呼叫cm函式的時候就要這樣 cm(&a);

14樓:操羽

1、什麼是const?

常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的。(當然,我們可以偷樑換柱進行更新:)

2、為什麼引入const?

const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。

3、const有什麼主要的作用?

(1)可以定義const常量,具有不可變性。

例如:const int max=100; int array[max];

(2)便於進行型別檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。

例如: void f(const int i) 編譯器就會知道i是一個常量,不允許修改;

(3)可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。 同巨集定義一樣,可以做到不變則已,一變都變!

如(1)中,如果想修改max的內容,只需要:const int max=you want;即可!

(4)可以保護被修飾的東西,防止意外的修改,增強程式的健壯性。 還是上面的例子,如果在函式體內修改了i,編譯器就會報錯;

例如: void f(const int i)

(5) 為函式過載提供了一個參考。

class a //一個函式

void f(int i) const //上一個函式的過載 ......

}; (6) 可以節省空間,避免不必要的記憶體分配。 例如:

#define pi 3.14159 //常量巨集

const doulbe pi=3.14159; //此時並未將pi放入rom中 ......

double i=pi; //此時為pi分配記憶體,以後不再分配!

double i=pi; //編譯期間進行巨集替換,分配記憶體

double j=pi; //沒有記憶體分配

double j=pi; //再進行巨集替換,又一次分配記憶體!

const定義常量從彙編的角度來看,只是給出了對應的記憶體地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有一份拷貝,而#define定義的常量在記憶體中有若干個拷貝。

(7) 提高了效率。

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

編輯本段問題1:const變數&常量

例:為什麼下面的例子在使用一個const變數來初始化陣列,ansi c的編譯器會報告一個錯誤呢?

const int n = 5;

int a[n];

答案與分析:

1)這個問題討論的是「常量」與「只讀變數」的區別。常量,例如5, "abc",等,肯定是隻讀的,因為常量是被編譯器放在記憶體中的只讀區域,當然也就不能夠去修改它。而「只讀變數」則是在記憶體中開闢一個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。

c語言關鍵字const就是用來限定一個變數不允許被改變的修飾符(qualifier)。上述**中變數n被修飾為只讀變數,可惜再怎麼修飾也不是常量。而ansi c規定陣列定義時長度必須是「常量」,「只讀變數」也是不可以的,「常量」不等於「不可變的變數」。

但是在c99中,區域性陣列是可以使用變數作為其長度的。

2)但是在標準c++中,這樣定義的是一個常量,這種寫法是對的。實際上,根據編譯過程及記憶體分配來看,這種用法本來就應該是合理的,只是ansi c對陣列的規定限制了它(實際上用gcc或vs2005編譯以上**,確實沒有錯誤產生,也沒有給出警告)。

3)那麼,在ansi c中用什麼來定義常量呢?答案是enum型別和#define巨集,這兩個都可以用來定義常量。

4)編輯本段問題2:const限定內容

例:下面的**編譯器會報一個錯誤,請問,哪一個語句是錯誤的呢?

typedef char * pstr;

char string[4] = "bbc";

const char *p1 = string; //1式

const pstr p2 = string; //2式

p1++;

p2++;

答案與分析:

問題出在p2++上。

1)const使用的基本形式: const type m;

限定m不可變。

2)替換基本形式中的m為1式中的*p1,替換後const char *p1;

限定*p1不可變,當然p1是可變的,因此問題中p1++是對的。

3)替換基本形式中的type為2式中的pstr,替換後const pstr m;

限定m不可變,題中的pstr就是一種新型別,因此問題中p2不可變,p2++是錯誤的。

編輯本段問題3:const & 指標

例一下面分別用const限定不可變的內容是什麼?

1)const在前面

const int nvalue; //nvalue是const

const char *pcontent; //*pcontent是const, pcontent可變

const char* const pcontent; //pcontent和*pcontent都是const

2)const在後面,與上面的宣告對等

int const nvalue; //nvalue是const

char const * pcontent; //*pcontent是const, pcontent可變

char* const pcontent; //pcontent是const,*pcontent可變

char const* const pcontent; //pcontent和*pcontent都是const

答案與分析:

const和指標一起使用是c語言中一個很常見的困惑之處,在實際開發中,特別是在看別人**的時候,常常會因為這樣而不好判斷作者的意圖,下面講一下我的判斷原則:

const只修飾其後的變數,至於const放在型別前還是型別後並沒有區別。如:const int a和int const a都是修飾a為const。

*不是一種型別,如果*ptype之前是某型別,那麼ptype是指向該型別的指標

一個簡單的判斷方法:指標運算子*,是從右到左,那麼如:char const * pcontent,可以理解為char const (* pcontent),即* pcontent為const,而pcontent則是可變的。

[1]例二int const * p1,p2;

p2是const;(*p1)是一整體,因此(*p1)是const,但p1是可變的。int *

p1,p2只代表p1是指向整型的指標,要表示p1、p2都是指標是需寫成int * p1,* p2。所以無論是* const

p1,p2還是const * p1,p2,裡面的*都是屬於p1的。

例三int const * const p1,p2;

p2是const,是前一個const修飾的,*p1也被前一個const修飾,而p1被後一個const修飾。

例四int * const p1,p2;

p1是const,(* const p1)是整體,所以const不修飾p2。

例五指標指向及其指向變數的值的變化

const在*的左邊,則指標指向的變數的值不可變;在*的右邊,則指標的指向不可變。簡記為「左定值,右定向」。

1)指標指向的變數的值不能變,指向可變

int x = 1;

int y = 2;

const int* px = &x;

int const* px = &x; //這兩句表示式一樣效果

px = &y; //正確,允許改變指向

*px = 3; //錯誤,不允許改變指標指向的變數的值

2)指標指向的變數的值可以改變,指向不可變

int x = 1;

int y = 2;

int* const px = &x;

px = &y; //錯誤,不允許改變指標指向

*px = 3; //正確,允許改變指標指向的變數的值

3)指標指向的變數的值不可變,指向不可變

int x = 1;

int y = 2;

const int* const px = &x;

int const* const px = &x;

px = &y; //錯誤,不允許改變指標指向

*px = 3; //錯誤,不允許改變指標指向的變數的值

補充在c中,對於const定義的指標,不賦初值編譯不報錯,

即int* const px;等不會報錯。

但是,在c++中

int* const px;和const int* const px;會報錯,const int* px;不報錯。

必須初始化指標的指向

強烈建議在初始化時說明指標的指向,防止出現野指標!

C語言指標函式的問題,關於C語言指標函式的使用問題

你這個問題,就是典型的不瞭解編譯過程的人容易犯的錯誤,關於指標和記憶體分配的問題,樓上已經講了很多了,這裡補充一點 你這段 裡 str hello world 這樣的定義,hello world 字串是屬於const char,編譯的時候,會編譯在const資料區,這一段的資料是受系統保護的,是不允...

c語言printf函式的問題,C語言關於printf函式的問題 printf(「 d」),後面什麼都沒有,為什麼輸出的是上一個輸出的結果

printf d,d,d,d n a b c,a b c a b c a b c 因為你這段中的a b c執行完相當與將c的值賦予b,b的值再賦予a,相當於a 3,b 3,c 3。所以後面的結果與前面不同 你沒打錯吧!第一行結果輸出的是 3,1,0,0 啊!是你題目寫錯吧!是賦值 b c 就是c的值...

c語言函式呼叫問題,C語言函式呼叫問題

優化了你的程式,問題好多,你自己研究一下吧 include int ds int x 真心看不懂你的ds 函式思想!有那麼複雜嗎?return x0 int yz int sum1 int main 如果不為顯示中間結果,這些都可以省。x0 ds x sum x x0 n printf 第 d次計算...