题目:
1. #include <stdio.h>
2.
3. int main(){
4. char *lines[5] = {
5. "COSC1283/1284", //string0
6. "Programming", //string1
7. "Techniques", //string2
8. "is", //string3
9. "great fun" //string4
10. };
11.
12. char *str1 = lines[1];
13. char *str2 = *(lines + 3);
14. char c1 = *(*(lines + 4) + 6);
15. char c2 = (*lines + 5)[5];
16. char c3 = *lines[0] + 2;
17.
18. printf("str1 = %s\n", str1);
19. printf("str2 = %s\n", str2);
20. printf(" c1 = %c\n", c1);
21. printf(" c2 = %c\n", c2);
22. printf(" c3 = %c\n", c3);
23.
24. return 0;
25. }
运行结果:
str1 = Programmingstr2 = isc1 = fc2 = 2c3 = E
分析如下:
①lines[1]:它是一个指针,指向字符串 string1,即 string1 的首地址。
②
*(lines + 3):lines + 3 为数组中第 3 个元素的地址,*(lines + 3) 为第 3 个元素的值,它是一个指针,指向字符串 string3。
③
*(*(lines + 4) + 6):*(lines + 4) + 6 == lines[4] + 6 == string4 + 6,表示字符串 string4 中第 6 个字符的地址,即 f 的地址,所以 *(*(lines + 4) + 6) 就表示字符 f。
④ (*lines + 5)[5]:*lines + 5 为字符串 string0 中第 5 个字符的地址,即 2 的地址,(*lines + 5)[5]等价于 *(*lines + 5 + 5),表示第 10 个字符,即 2。
⑤
*lines[0] + 2:lines[0] 为字符串 string0 中第 0 个字符的地址,即 C 的地址;*lines[0] 也就表示第 0 个字符,即字符 C。字符与整数运算,首先转换为该字符对应的 ASCII 码,然后再运算以 *lines[0] + 2 = 67 + 2 = 69,69 对应的字符为 E。