2013-05-01 103 views
2

一些懷疑我有一個關於C.約char和INT的指針用C

[1] char *somestring = "somestring" 

[2] int *someint = 45 

爲什麼[1]工作和[2]不是指針問題?

爲什麼我們

printf("%s",str1); 

,而不是

printf("%s",*str1); 

回答

1

你的問題的第一部分開始,讓我們看看當你使用的語句會發生什麼:

char *somestring = "somestring"; 

在這裏,你聲明character pointersomestring,字符串somestring存儲在內存的地址並且該地址被分配給指針somestring(相信我,使用相同的名稱指向指針的字符串以及它所指向的字符串的內容,因爲您已經完成了!)

現在你可以使用這個指針somestring來引用那個字符串。

現在看,它是如何在下面的語句不同,這將產生錯誤:

int *someint = 45 

這裏你聲明瞭一個整數指針someint(的int*類型),但分配的整數值(int類型),以it.Not不僅有一個type不匹配,但它可以產生不可預知的行爲,因爲你只是不知道什麼已經是在地址45.I想這是你所需要的:

int num=45,*someint=# 

這裏地址&運營商分配變量num指針的地址,你可以取消對它的引用使用*操作如下:

printf("The value pointed by the pointer is ",*someint); 

someint*如何承載不同的含義在聲明聲明中作爲參數printf()

來到你的問題,爲什麼我們printf(),而不是*str1使用str1的第二部分,以及,str1表示字符串,這不過是數組中的第一個字符的地址的基址。因此,通過我告訴你關於*運營下去,*str1指存儲在陣列,即array.Run下面的代碼的第一個字符的基地址的字符,這將是明確的:

#include<stdio.h> 

int main(void) 
{ 
    char str1[10]="Davies"; 

    printf("str1 is : %s \n but *str1 is : %c",str1,*str1); 
} 

輸出str1 is : Davies

 but *str1 is : D 
5

在C中,文字字符串基本上是一個(只讀)字符數組,所以char *(是的,它應該是const char *,但是這會丟失到歷史記錄中)。一個文字int不是一個數組或指針,所以指向它的指針是無意義的。類型只是不匹配。

1
[2] int *someint = 45 

不起作用,因爲如果沒有顯式強制轉換,您無法將int轉換爲int *。

編輯:其實,我只是試圖編譯一個示例代碼,它在Linux下用GCC 4.7編譯,但它打印出一條警告消息。

45被視爲int。

[2] int *someint = (int *) 45 

關於printf%s手段,代替%schar *陣列,並停止當你到達'\0'

+0

@Vishy爲什麼不呢,在GCC它編譯和作品。 – stdcall 2013-05-01 08:39:36

+1

誰談及剝奪它? – stdcall 2013-05-01 08:53:46

+0

在嵌入式和低級編程中,爲指針分配一個常數是非常重要的。這不是誤導 – stdcall 2013-05-01 09:04:36

1

char *somestring = "somestring", 「somestring」 是一個字符列表/陣列。

while int *someint = 45 只是一個整數而不是列表/整數的整數。 這相當於char *somestring = 'a'這是無效的。

1

當你聲明一個字符串時,例如"somestring"編譯器在編譯時知道這一點,並將其放入程序中的一段單獨的內存中。然後編譯器將這個位置的內存地址分配給你的字符串指針。

的替代方案將是字符存儲在棧上的字符串:

char someString[] = { 's', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 }; 

因爲一個整數比的字符串的情況下(與配合到的存儲器位置)它通常只是delcared堆棧上。

int someInt = 45; 
1
int *someint = 45; 

是一樣的話說:

int *someint; 
someint = 45; 

這將警告編譯:

initialization makes pointer from integer without a cast 

而且將編譯沒有警告,如果你將它轉換:someint = (int *)45;

這是因爲,你基本上是說someint的「價值」存儲在地址45或0x2d,這顯然不是聲明​​的情況。

您現在可以通過取消引用來添加值:*someint = someval;。因此,現在someval將存儲在您之前指定的地址(儘管這可能無效,具體取決於操作系統已存儲在那裏)。

我希望這可以解決問題。