[英]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]
,當a
是char *
,在a
( a[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**
*j
是char*
**j
是一個char
,等價於*(*(j+0)+0)
,等價於j[0][0]
&j
是一個char***
等等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.