2013-03-17 27 views
-1

我剛剛開始用c中的指針。這個程序提供了所需的輸出,但是當我編譯它時,我得到了下面的警告,我做錯了什麼?在一個非常基本的指針程序中的警告C

pointer.c:3: warning: initialization makes pointer from integer without a cast 

pointer.c:5: warning: incompatible implicit declaration of built-in function ‘printf’ 

pointer.c:8: warning: assignment from incompatible pointer type 

pointer.c:12: warning: assignment makes pointer from integer without a cast 

而且我的代碼是:

int main (int argc, char *argv[]) 
{ 
    int *x=2, *ampx, *starampx, starx; 

    printf("x="); 
    printf("%d\n",x); 

    ampx=&x; 
    printf("&x="); 
    printf("%d\n",&x); 

    starampx=*ampx; 
    printf("*&x="); 
    printf("%d\n",starampx); 

    return 0; 
    } 
+3

您應該一次詢問1個問題。您一次提出多個問題,這就是爲什麼我認爲應該關閉這個問題的原因。我不同意H2C03提出的一些小問題,但我相信如果這兩個問題都是一個問題的話,所有這些問題都已經涵蓋在SO上。 – Hogan 2013-03-17 11:54:34

+0

明白了@Hogan,thankx :) – 2013-03-17 12:02:50

回答

4

試試這裏就是爲什麼:

  1. initialization makes pointer from integer without a cast - int *x = 2, ...應該int x = 2, ...
  2. incompatible implicit declaration of built-in function ‘printf’ - 你需要在頂部
  3. 添加#include <stdio.h>assignment from incompatible pointer type - 將由#1更改修復
  4. assignment makes pointer from integer without a cast - *starampx應該在starampx的聲明中。

    printf("%p\n",&x); 
    

    這是你的固定程序上ideone:link

此外,印刷指針應%p符,而不是%d來完成。

+0

謝謝你@dasblinkenlink。這真的很有用:) – 2013-03-17 11:59:29

4
int *x=2 

實際上是造成你的程序有不確定的操作。它告訴編譯器指向地址爲2,該地址可能有效也可能不正確,並且指針會導致未定義的行爲。
每當你使用指針時,你需要讓指針指向一個足夠大的有效內存來存儲int,然後才能存儲任何東西。所以,你要麼需要:

int i = 2; 
int *x = &i; 

,或者你只是使用:

int x = 2; 

考慮,如何使用x在以後的程序,後者是你所需要的。

您需要包含stdio.h,它告訴編譯器printf是標準c庫函數。

+1

它在C-x中定義將指向位置2.如果您嘗試使用它,但可能會給出訪問衝突,但它已被定義。 – Hogan 2013-03-17 11:51:41

+0

@霍根:爲清晰起見進行了編輯。 – 2013-03-17 11:53:37

+0

更好的是,它會*導致*未定義的行爲。我喜歡。 – Hogan 2013-03-17 11:56:15

3

在您的代碼中,在此聲明中,您遇到問題。

int *x=2, *ampx, *starampx, starx; 
    ^  ^
    |   | 

*x是一個指針。要存儲2的值,您需要爲相同的空間分配空間。取而代之的是當前實現的,請與

int x=2, *ampx, starampx, starx; 
+0

謝謝你@Ganesh。這真的有幫助:) – 2013-03-17 12:00:15