关于取数组地址的识记(&s+1,s+1,&s[0]+1)

 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是一个具体的字符。这一点很重要,一定要明白。

原文地址:https://www.cnblogs.com/ltlly/p/4225641.html