1 #include <stdio.h> 2 #include <malloc.h> 3 4 int main() 5 { 6 char s1[] = {'H', 'e', '1', '2', 'o'}; 7 char *p=(char *)(s1+3); 8 printf("*p:%c ",p[0]); 9 char *p2=(char *)(&s1[0]+4); 10 printf("*p2:%c ",p2[0]); 11 char *p3=(char *)(&s1+1); 12 printf("*p3:%c ",p3[-1]); 13 14 return 0; 15 }
输出:
*p:2
*p2:o
*p3:o
在这之前,取数组值时老是不能区分s1+2,&s1[0]+2,&s1+2之间的区别,今天特意测试了下,原来他们的区别如下:
s1+2:
指从s1数组0位开始向下移动2位的取值。
&s1[0]+2:
同s1+2一样,指从s1数组0位开始向下移动2位的取值。
特别注意点:&s1+1:
指的是移到s1整个数组的下一个位置,相当于移出了s1数组。
特别注意:
int main(){
char *lines[5] = {
"COSC1283/1284",
"Programming",
"Techniques",
"is",
"great fun"
};
char *str1 = lines[1];
char *str2 = *(lines + 3);
char c1 = *(*(lines + 4) + 6);
char c2 = (*lines + 5)[5];
char c3 = *lines[0] + 2;
printf("str1 = %s
", str1);
printf("str2 = %s
", str2);
printf(" c1 = %c
", c1);
printf(" c2 = %c
", c2);
printf(" c3 = %c
", c3);
return EXIT_SUCCESS;
}
输出 :
str1 = Programming str2 = is c1 = f c2 = 2 c3 = E
上面的题目中:
- lines[1]:它是一个指针,指向字符串string1,即string1的首地址。
- *(lines + 3):lines + 3 为lines[5]数组第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的地址。字符与整数运算,首先转换为该字符对应的ASCII码值,然后再运算,所以 *lines[0] + 2 = 67 + 2 = 69。不过要求输出字符,所以还要转换成69所对应的字符,即E。
而lines,是一个指向指针的指针,它的类型为 char **,所以 *lines 是一个指向字符的指针,**lines是一个具体的字符。这一点很重要,一定要明白。