簡體   English   中英

c - 為什么將字符指針索引為int是有意義的?

[英]c - why does it make sense that indexing a character pointer is an int?

char *a = "apple";
printf("%s\n", a);  // fine
printf("%s\n", a[1]);  // compiler complains an int is being passed

為什么索引字符串指針給我一個int? 我期待它只是從第一個位置打印字符串(實際上當我使用&a[1]時會發生這種情況)。 為什么我需要獲得地址?

這就是[]運算符的定義方式 - a[1] ,當achar * ,在aa[0]是第一個)指向的char之后獲取下一個char

這個難題的第二部分是,當作為函數的可變長度參數列表的一部分傳遞時, char值總是被提升為int (或很少, unsigned int )。

a等價於&a[0] ,並從第一個字符打印 - 因此從第二個字符開始打印&a[1]是有意義的。 你也可以使用a + 1 - 這完全相同。

如果使用打印單個字符的%c轉換說明符,則可以使用a[1]僅打印第二個字符:

printf("%c\n", a[1]);

表達式a[1]產生一個char ,並且在擴展為int的表達式中。
您可以使用%c打印字符:

char *a = "apple";
printf("%c\n", a[1]);   // prints 'p'

您可以使用a+1來實現您想要的效果

printf("%s\n", a+1);    // prints 'pple'

另一種解釋方法:

char *a2 = a+1;   // a2 points to 'pple'   
a[1] ≡ *(a+1)  ≡ *a2 

%s需要一個char *指針。 單獨的Char被解釋為整數。 而且,[1]給你第二個元素,而不是第一個元素!

字符(即[1]求值的東西)是整數,但printf()的“%s”格式化程序需要一個指針。 請注意,檢測到此錯誤的事實是某些編譯器提供的擴展功能 - 它不是標准C的一部分。其他編譯器只會在運行時失敗,可能是核心轉儲。

char *a = "bla"

a :是char* ,你應該使用%s作為printf(...) ;

a[1]相當於*(a+1) ,則a[1]char ,你應該使用%c作為printf(...) ;

&a[1]相當於&(*(a+1)) ,然后&a[1]char* ,你應該使用%s作為printf(...) ;

這更像是一個指針問題。 為了更好地理解指針是如何工作的,請這樣思考:

char *j;

j是一個char*
*j是一個char ,等同於j[0]
*(j+1)是一個char ,等同於j[1]
&(*j)char* ,與&j[0]等效,等同於j
&j是一個char**

另一個例子:

char j**

j是一個char**
*jchar*
**j是一個char ,等價於*(*(j+0)+0) ,等價於j[0][0]
&j是一個char***

等等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM