2015-02-07 85 views
2
int func (int a, int b, int *c); 

int main() 
{ 
int res, x, y, z;  //int res, x, y, *z; 

printf("enter x \n"); 
scanf("%i", &x); 
printf("enter y \n"); 
scanf("%i", &y); 
res = func(x, y, &z);   //res = func(x, y, z); 
printf("result addition: %i, result multiplication %i \n", res, *z); 
return 0; 
} 


int func (int a, int b, int *c) 
{ 
int result; 

result = a +b; 
*c = a*b;  //(1)  alternative:d=a*b 
       //      c=&d 
return result; 
} 



我的問題是,我不明白,爲什麼當我寫它,因爲我喜歡我的評論(這樣做代碼不起作用// )。編譯器警告我,z沒有初始化,但爲什麼在工作版本中沒有這個問題?
另一件事我不明白的是,爲什麼它是正確的引用指針的值,就像我在(1),但它是錯在下面的代碼做了它:理解指針(指值)

int main() 
{ 
int a, *c, *d; 

scanf("%i", &a); 

*c=a; //wrong 
d=&a; //correct 
return 0; 
} 
+0

只是一個提示,但你應該總是把二進制運算符之間的空間,如乘法。你不想碰到一個bug,並且意識到你實際上已經解引用了某些東西,只是因爲'*'被視爲一元解引用操作符。你的代碼很簡單,所以你現在不必擔心,但如果它變得複雜,你可能會犯錯誤。 – Kacy 2015-02-07 22:08:05

+0

當我看到什麼人投票下來,什麼人投票在這裏,它讓我頭痛 – Mcs 2015-02-07 22:11:16

回答

1

編譯器警告我,是Z沒有初始化,但爲什麼在工作版本中不是問題?

編譯器會警告您有關z未初始化,因爲您是按值傳遞它的。而你傳遞的是一個未初始化的值(這基本上是垃圾)。 當你傳遞z的地址時,它不會發出警告,因爲將變量的地址傳遞給指針沒有任何問題。編譯器不檢查你是否要解引用c,並使用z的未初始化值。編譯器不是那麼「聰明」。它假設你會做正確的事情,並通過取消引用c來分配一個值(你確實這樣做了)。

爲什麼它是正確的引用指針的值,像我這樣做是在(1),但它是錯在下面的代碼

至於你的第二個問題,第一個例子中的作品,因爲功能的參數得到初始化爲你稱之爲函數的任何值。 第二個示例不起作用,因爲您使用的是未初始化的本地變量。

1

在哪裏聲明一個變量來看,它進入的存在,在可與&進行檢索,而(如果不初始化)的內容該位置的是未初始化的一些內存位置。當zint時,&z是一個明確定義的指針,因爲它是變量的地址,而不是一個的內容。當zint *,z的內容本身就是一個指針,但它沒有被初始化;因此警告(很可能,當scanf()嘗試寫入任意內存位置時,程序將崩潰)。

0

你的問題意味着你不知道指針的知識,我建議你第一次讀到它們,

一個指針指向一個變量,當你做

*c = a 

你想分配值用間接運算符'*'由c指向的變量,

問題是,c沒有指向代碼中的任何內容。

在第二個

d = &a; 

你使指針d點到。換句話說,你指定了d的地址。你真的應該首先閱讀關於指針的內容,否則,無論我們在這裏說什麼都不會對你有意義。

+0

我的問題不是,爲什麼* c = a是錯的,d =&a是正確的,我的問題是,爲什麼它是正確的) – pgz 2015-02-07 22:18:20

+0

請閱讀你自己的問題,這是你的問題的一部分,無論如何,很明顯你不知道什麼是指針,提出一個問題並不壞,但首先閱讀有關它們,似乎你不知道甚至不明白他們的目的 – Mcs 2015-02-07 22:19:52

+0

也關於你的關於z的問題,它不起作用,因爲在C中你不能通過函數永久地改變變量的值,除非你通過指針來改變它, – Mcs 2015-02-07 22:22:25