有关数组的计算(你会了吗)

####关于数组,我们必须学会下面的计算

//1.数组名单独放在sizeof()内部,数组名表示整个数组
    所以sizeof(数组名)计算的是整个数组的大小,单位是字节
//2.&数组名,数组名表示整个数组   
    所以&数组名取出的是整个数组的地址
//3.除此之外,所有的数组名都表示首元素的地址
    数组名+i相当于下标为i的地址

######一维数组

整型   int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//16
  • 数组名单独放在sizeof()内部,代表整个数组,所以计算的是整个数组的大小;
    数组a里面有四个整型,所以输出 16。
printf("%d\n",sizeof(a+0));//4
  • 数组名没有单独放在sizeof()内部,也没有和&连用,所以不代表整个数组,即为首元素地址,加0,即依旧为首元素地址,地址占四个字节,所以输出为 4。
printf("%d\n",sizeof(*a));//4
  • 看sizeof内部,得到数组名代表首元素地址,但是 * 解引用首元素地址为首元素,整型为4个字节,所以依旧输出为 4 。
printf("%d\n",sizeof(a+1));//4
  • 数组名+1表示下标为1的元素地址,即输出为 4 。
printf("%d\n",sizeof(a[1]));//4

  • 即第二个元素的大小,输出为 4 。
printf("%d\n",sizeof(&a));//4
  • &数组名,数组名表示整个数组,即取出整个数组的地址,所以输出为 4 。
//printf("%d\n",sizeof(*&a));//16
  • (&a)表示整个数组的地址,但是‘ * ’ 解引用整个数组,即表示取出整个数组的元素;
  • 即四个元素的字节大小,输出为 16 。
printf("%d\n",sizeof(&a+1));//4
  • (&a)表示取出整个数组的地址,加 1 即表示跳过整个数组,停在最后一个元素4的后面;
  • 但是依旧表示一个数组的地址,输出为 4 。
printf("%d\n",sizeof(&a[0]));//4
  • a[0]即表示首元素,&a[0]即首元素地址,输出为 4 。
printf("%d\n",sizeof(&a[0]+1));
  • 首元素地址加 1 ,即第二个元素地址,依旧是一个地址,输出也为 4 。
字符  char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//6
  • 数组名单独放在sizeof()内部,其表示整个数组;即求数组的大小;
  • 数组里面有6个字符,所以输出为 6 。
printf("%d\n", sizeof(arr+0));//4
  • arr+0代表首元素+0,则还是首元素地址,所以地址输出为 4 。
printf("%d\n", sizeof(*arr));//1
  • 数组名表示首元素地址,被‘ * ’解引用为首元素,则字符大小为1个字节;
  • 所以输出为 1 。
printf("%d\n", sizeof(arr[1]));//1
  • 第二个元素的大小,输出为 1 。
 printf("%d\n", sizeof(&arr));
  • &数组名,数组名表示整个数组,所以表示取出整个数组的地址;
  • 输出为 4 。
printf("%d\n", sizeof(&arr+1));
  • &arr+1表示跳过整个数组,停在 f 的后面,依旧表示地址,输出为 4 。
printf("%d\n", sizeof(&arr[0]+1));
  • 首元素地址+1表示第二个元素的地址,输出为 4 。
注意    strlen   
printf("%d\n", strlen(arr));//随机值
  • strlen求字符串长度,遇到字符串结束标志‘ \0 ’才能停下来,在这里,数组里面没有’\0’,所以,它停下来是个随机值。
printf("%d\n", strlen(arr+0));//随机值
  • 数组名+0,依然表示首元素地址,但是同上面的一样依然没有\0,所以也是随机值。
printf("%d\n", strlen(*arr));//error
  • 传给strlen函数的参数是一个地址,*arr表示首元素的值,即字符a 看成一个地址;
  • 是 不能得到值的,所以这个输出是错误的 。
printf("%d\n", strlen(arr[1]));//error
  • 第二个元素的值传给strlen 也是不能输出的,所以也是error。
printf("%d\n", strlen(&arr));//随机值
  • 数组地址和首元素地址是同一位置相数的,同strlen(arr)一样也是随机值。
printf("%d\n", strlen(&arr+1));//随机值
  • 跳过整个数组依旧是随机值。
printf("%d\n", strlen(&arr[0]+1));//随机值
  • 首元素地址+1是第二个元素开始数,依旧是一个随机值。
char arr="abcdef";//字符串初始化
printf("%d\n", sizeof(arr));//7
  • 把字符串放进去,则有字符串结束标志‘ \0 ’,所以输出为 7 。
printf("%d\n", sizeof(arr+0));//4
  • 首元素地址+0还是首元素地址,输出为 4 。
printf("%d\n", sizeof(*arr));//1
  • 首元素地址解引用为首元素,即一个字符,所以输出为 1 。
printf("%d\n", sizeof(arr[1]));//1
  • 第二个元素的大小,输出为 1 。
printf("%d\n", sizeof(&arr));//4
  • 整个数组的地址,输出为 4 。
printf("%d\n", sizeof(&arr+1));//4
  • 跳过整个 数组的数组地址,输出为 4 。
 printf("%d\n", sizeof(&arr[0]+1));//4
  • 第二个元素的地址,输出为 4 。
printf("%d\n", strlen(arr));//6
  • 整个数组的长度,字符串有结束标志,所以到 f 停下来,输出为 6 。
printf("%d\n", strlen(arr+0));//6
  • 首元素地址,从首元素开始数即为 6 ;输出为 6 。
printf("%d\n", strlen(*arr));//error
  • 把首元素传给 strlen ,是错误的。
printf("%d\n", strlen(arr[1]));//error
  • 第二个元素传给 strlen ,是错误的。
printf("%d\n", strlen(&arr));//6
  • 整个数组的地址传给strlen,即求出整个数组的大小,输出为 6 。
printf("%d\n", strlen(&arr+1));//随机值
  • 跳过整个 数组,同时也跳过了 ‘ \0 ’,所以不能确定停在了哪里,所以输出为随机值。
printf("%d\n", strlen(&arr[0]+1));//5
  • 从第二个元素开始数,即从 b 到 f ,所以长度为 5 。

  char*   p = "abcdef";//p是指针变量,字符指针
printf("%d\n", sizeof(p));//4
  • p是指针变量,存放的是地址,即为4个字节,输出为 4 。
printf("%d\n", sizeof(p+1));//4
  • 第二个元素的地址,输出为 4 。
printf("%d\n", sizeof(*p));//1
  • 解引用为元素,字符大小为 1 。
printf("%d\n", sizeof(p[0]));//1
  • p+[0] 解引用为首元素,大小为1 个字节。
printf("%d\n", sizeof(&p)); //4
  • &p还是地址,输出为 4 。
printf("%d\n", sizeof(&p+1));//4
  • 跳过p 的地址,地址大小还是 4 。
printf("%d\n", sizeof(&p[0]+1));//4
  • p的地址+1还是地址,输出为 4。

printf("%d\n", strlen(p));//6

  • p存的是a 的地址,从a 往后数,即到 \0 处停下来,所以输出为 6。
printf("%d\n", strlen(p+1));//5
  • 字符指针+1跳过一个字符,所以从b 开始数,即输出为 5 。
 printf("%d\n", strlen(*p));//err
  • ’ * '解引用p为元素a ,a 传给 strlen 是错误的。
 printf("%d\n", strlen(p[0]));//err
  • a 传给 strlen 错误 。
 printf("%d\n", strlen(&p));//随机值

p 是指针变量,&p是从p的地址往后数,不确定数到哪里,所以是随机值。

 printf("%d\n", strlen(&p+1));//随机值
  • 不确定数到哪里,所以也是随机值。
 printf("%d\n", strlen(&p[0]+1));//5
  • 从b 的地址往后数,即长度为 5 。

######二维数组

  1. sizeof ( arr[ 0 ] ) 为第一行的地址
  2. sizeof ( arr[ 0 ]+1 ); arr [ 0 ] 降级为第一行第一个元素的地址,所以该表达式表示第一行第二个元素的地址
  3. 二维数组的首元素为第一行;表达式sizeof ( arr +1)中,arr 降级为首元素地址,即第一行地址;加1则表示跳过第一行,即为第二行。

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/79811165
今日推荐