2017-04-16 39 views
-3

在下面的代碼中,爲什麼我不能解引用數組名,因爲當一個數組作爲參數傳遞給一個函數時,它變成了數組第一個元素的指針,那麼爲什麼我們不能解引用呢?爲什麼我們不能使用數組名稱的間接運算符?

#include <stdio.h> 
int main(void) { 

    char s[] = "radha"; 
    int a[2] = {0,1}; 
    printf("%s ", *s); 
    printf("%d", *a); 
    return 0; 
} 

我得到段錯誤上面的代碼,有什麼原因就在這裏,當我使用[0],它在內部轉換爲*(A + 0),那麼什麼是在根本問題做* a或* S,請澄清。

+3

'的printf( 「%S」,* S);' - >'的printf( 「%S」,S);'' –

+4

* s' =='S [0] ==''」 r''。你想'printf(「%s」,s);'或'printf(「%c」,* s);' – BLUEPIXY

+1

可怕的問題標題,你應該想一個更好的問題。 –

回答

3

我有你的兩個建議,

  1. 閱讀文檔。

    • "%s"符預計char一個指針,要傳遞一個char然後將其認爲是一個整數,並且解引用就好像它是造成未定義的行爲的指針。

    如果你閱讀文檔,並瞭解char[]轉化爲char *也是廢棄一個char * poitner會給你一個char,那麼你會明白爲什麼這是錯的。

  2. 啓用編譯器警告。如果你這樣做了,那麼一個警告告訴你,你傳遞了錯誤的類型會爲你節省很多時間,並讓你更多地學習如何調用給定的函數。

    如果您忽略了警告,情況會更糟。除非事先知道編譯器會抱怨什麼,否則不應該忽略警告。如果警告不是預期的,那麼它很可能是一個錯誤。

+0

我現在弄錯了,如果我們在函數原型中使用char str []和char * str,你能解釋一下是否有區別。 – stackuser

+3

對於函數調用,沒有區別。原因是當你把它作爲函數參數傳遞時,'char []'會自動轉換爲'char *'。 –

7

printf("%s ",*s);期望第二個參數是在傳遞時指向字符串的指針char 'r'(取消引用s爲您提供了第一個數組項目,如預期的那樣)。

相關問題