2014-01-23 57 views
0
如下

代碼演示使用指針作爲一個練習:指針在C語法錯誤

#include<stdio.h> 
struct s{ 
    int *p; 
}; 
int main(){ 
    struct s v; 
    int *a = 5; 
    v->p = a; 
    printf("%d",v->p); 
    return 0; 
} 

爲什麼是語法錯誤:

invalid type argument -> (struct s) 
+0

什麼是'int * a = 5;'應該表示什麼?我認爲你需要'int a = 5;'然後'v.p =&a;'(其中'&'是**運算符的**地址)。 – OnlyThenDidIReckonMyCurse

回答

2

您已經聲明v不被指針( struct s v; - no *),並且您正在嘗試使用->,它僅適用於指針。您還聲明a是指針(int *a - 有一個*),但您嘗試使用整數初始化它。

2

要訪問結構對象的成員,我們使用點.運算符。

v.p = a; 

當結構對象需要通過指針加入時,我們使用運算符->

struct s *vp = &v; 

vp->p = a; 

而且你分配到一個指針

int *a = 5; 

這是非常危險的,因爲任何試圖取消對它的引用導致崩潰的整數。

3

與StackOverflow上關於C的許多問題一樣,您需要回到基礎知識。

  • x->y是一個簡潔的寫法(*x).y
  • *運算符接受一個指針,併爲您提供與該指針相關的變量。

所以現在你的問題的答案很簡單。 v->p = a;表示與(*v).p = a;相同的東西*運算符的值v將指針v變成一個變量......但v不是指針。這是一個struct s。因此,這是一個錯誤; *運算符只能應用於指針類型的東西。

2

invalid type argument of ‘->’ (have ‘struct s’)錯誤顯示在第8行& 9.都嘗試使用v->p引用結構的元素。在這種情況下,您應該將v->p更改爲v.p。這是因爲'v'已被分配並且不是指針。


這是用指針玩的一段整齊的代碼。一旦你得到了v.p編譯,你會看到每次引用'a'時的核心轉儲。這是因爲你聲明'a'是一個指針,並沒有爲實際的整數值分配任何空間。嘗試添加以下代碼以查看它的位置:

int b = 5; 
int* a = &b; 
printf("%d\n", b); 
printf("%d\n", *a); 
printf("%d\n", a);