一些懷疑我有一個關於C.約char和INT的指針用C
[1] char *somestring = "somestring"
和
[2] int *someint = 45
爲什麼[1]工作和[2]不是指針問題?
爲什麼我們
printf("%s",str1);
,而不是
printf("%s",*str1);
?
一些懷疑我有一個關於C.約char和INT的指針用C
[1] char *somestring = "somestring"
和
[2] int *someint = 45
爲什麼[1]工作和[2]不是指針問題?
爲什麼我們
printf("%s",str1);
,而不是
printf("%s",*str1);
?
你的問題的第一部分開始,讓我們看看當你使用的語句會發生什麼:
char *somestring = "somestring";
在這裏,你聲明character pointer
somestring,字符串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
在C中,文字字符串基本上是一個(只讀)字符數組,所以char *(是的,它應該是const char *,但是這會丟失到歷史記錄中)。一個文字int不是一個數組或指針,所以指向它的指針是無意義的。類型只是不匹配。
[2] int *someint = 45
不起作用,因爲如果沒有顯式強制轉換,您無法將int轉換爲int *。
編輯:其實,我只是試圖編譯一個示例代碼,它在Linux下用GCC 4.7編譯,但它打印出一條警告消息。
45被視爲int。
[2] int *someint = (int *) 45
關於printf
,%s
手段,代替%s
有char *
陣列,並停止當你到達'\0'
在char *somestring = "somestring"
, 「somestring」 是一個字符列表/陣列。
while int *someint = 45
只是一個整數而不是列表/整數的整數。 這相當於char *somestring = 'a'
這是無效的。
當你聲明一個字符串時,例如"somestring"
編譯器在編譯時知道這一點,並將其放入程序中的一段單獨的內存中。然後編譯器將這個位置的內存地址分配給你的字符串指針。
的替代方案將是字符存儲在棧上的字符串:
char someString[] = { 's', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', 0 };
因爲一個整數比的字符串的情況下(與配合到的存儲器位置)它通常只是delcared堆棧上。
int someInt = 45;
int *someint = 45;
是一樣的話說:
int *someint;
someint = 45;
這將警告編譯:
initialization makes pointer from integer without a cast
而且將編譯沒有警告,如果你將它轉換:someint = (int *)45;
。
這是因爲,你基本上是說someint
的「價值」存儲在地址45或0x2d
,這顯然不是聲明的情況。
您現在可以通過取消引用來添加值:*someint = someval;
。因此,現在someval
將存儲在您之前指定的地址(儘管這可能無效,具體取決於操作系統已存儲在那裏)。
我希望這可以解決問題。
@Vishy爲什麼不呢,在GCC它編譯和作品。 – stdcall 2013-05-01 08:39:36
誰談及剝奪它? – stdcall 2013-05-01 08:53:46
在嵌入式和低級編程中,爲指針分配一個常數是非常重要的。這不是誤導 – stdcall 2013-05-01 09:04:36