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次計算...