[英]C program: pointer and pointer of string
這是讓我感到困惑的代碼。
static char *s[] = {"black", "white", "pink", "violet"};
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
p = ptr; // p point to the address of (s+3), so "violet"
++p; // p point to "pink"
printf("%s", **p+1); // I though it print "pink" but answer is "ink", I'm not sure about the sequence of ** and +, which executes first and how is this one begins from "i"?
在++p
, p
不指向“粉紅色”。 它指向ptr[1]
, ptr[1]
指向s[2]
, s[2]
指向“pink”的第一個字符。
*p
是ptr[1]
,而**p
是s[2]
。 所以**p + 1
是&s[2][1]
,即“粉紅色”中的“i”。
它像是:
char *ptr = **p; // ptr points to the 'p' in "pink"
printf("%s", ptr + 1);
**p
指向pink
(即**p == s[2]
)。 增加該指針(**p) + 1
將使其指向pink
的i
,因此printf
將打印ink
。 初級。 :)
經驗法則是,如果你覺得需要聲明一個三重指針,你就做錯了。
*p
給出ptr[1]
**p
給出存儲在s+2
i,e "pink"
,它現在指向字符p
**p+1
給出字符串ink
static char *s[] = {"black", "white", "pink", "violet"};
上面的語句將s
定義為一個字符數組,並用大括號括起來的字符串文字的第一個元素的指針來初始化它的元素。 static
意味着數組s
具有內部鏈接,其生命周期貫穿整個程序運行。
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
上面的語句將ptr
定義為char **
類型的對象數組,即指向字符指針的指針。 它還定義了char ***
類型的p
,即指向字符指針的指針。 它用指向數組s
元素的指針初始化ptr
。
因此, ptr[0]
指向s[3]
, ptr[1]
指向s[2]
等等。 下面兩個語句是等價的。 這是因為數組ptr
衰減(評估)為指向其第一個元素的指針。
p = ptr;
// the above is equivalent to
p = &ptr[0];
++p; // makes p point to the next element of ptr
執行上述語句的副作用是增加p
,即使其指向下一個元素ptr[1]
。
**p+1
間接運算符*
具有更高的優先級。 因此,首先評估**p
。 由於p
指向ptr[1]
, *p
計算結果為ptr[1]
。 現在ptr[1]
指向s[2]
,因此**p
評估為s[2]
。 s[2]
指向字符串文字"pink"
的第一個元素。 這意味着**p + 1
指向下一個元素,即'i'
第二個元素。
printf("%s", **p + 1); // prints ink
// equivalent to
printf("%s", "pink" + 1); // prints ink
// equivalent to
printf("%s", &"pink"[1]); // prints ink
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.