一.sizeof和strlen的对比
1.sizeof
操作符,计算变量所占空间大小
2.strlen
库函数,函数原型为:
求的是字符串的长度,统计的是“\0”之前的字符个数
二.指针和笔试题解析
补充:数组名的意义
1.sizeof(数组名)
这里表示整个数组,计算的是整个数组所占空间的大小
2.&数组名
这里表示整个数组,取出的是整个数组的地址
3.其他
表示首元素的地址
1.一维数组
代码:
#include <stdio.h>
int main()
{
printf("%zu\n",sizeof(a));
printf("%zu\n",sizeof(a+0));
printf("%zu\n",sizeof(*a));
printf("%zu\n",sizeof(a+1));
printf("%zu\n",sizeof(a[1]));
printf("%zu\n",sizeof(&a));
printf("%zu\n",sizeof(*&a));
printf("%zu\n",sizeof(&a+1));
printf("%zu\n",sizeof(&a[0]));
printf("%zu\n",sizeof(&a[0]+1));
}
解释:
2.字符指针
例 2.1:
代码:
#include <stdio.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%zu\n", sizeof(arr));
printf("%zu\n", sizeof(arr + 0));
printf("%zu\n", sizeof(*arr));
printf("%zu\n", sizeof(arr[1]));
printf("%zu\n", sizeof(&arr));
printf("%zu\n", sizeof(&arr + 1));
printf("%zu\n", sizeof(&arr[0] + 1));
return 0;
}
解释:
例2.2
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%zu\n", strlen(arr));
printf("%zu\n", strlen(arr + 0));
printf("%zu\n", strlen(*arr));
printf("%zu\n", strlen(arr[1]));
printf("%zu\n", strlen(&arr));
printf("%zu\n", strlen(&arr + 1));
printf("%zu\n", strlen(&arr[0] + 1));
return 0;
}
解释:
例2.3
代码:
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%zu\n", sizeof(arr));
printf("%zu\n", sizeof(arr + 0));
printf("%zu\n", sizeof(*arr));
printf("%zu\n", sizeof(arr[1]));
printf("%zu\n", sizeof(&arr));
printf("%zu\n", sizeof(&arr + 1));
printf("%zu\n", sizeof(&arr[0] + 1));
return 0;
}
解释:
例2.4
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%zu\n", strlen(arr));
printf("%zu\n", strlen(arr + 0));
printf("%zu\n", strlen(*arr));
printf("%zu\n", strlen(arr[1]));
printf("%zu\n", strlen(&arr));
printf("%zu\n", strlen(&arr + 1));
printf("%zu\n", strlen(&arr[0] + 1));
return 0;
}
解释:
例2.5
代码:
#include <stdio.h>
int main()
{
char* p = "abcdef";
printf("%zu\n", sizeof(p));
printf("%zu\n", sizeof(p + 1));
printf("%zu\n", sizeof(*p));
printf("%zu\n", sizeof(p[0]));
printf("%zu\n", sizeof(&p));
printf("%zu\n", sizeof(&p + 1));
printf("%zu\n", sizeof(&p[0] + 1));
return 0;
}
解释:
例2.6
代码:
#include <stdio.h>
#include <string.h>
int main()
{
char* p = "abcdef";
printf("%zu\n", strlen(p));
printf("%zu\n", strlen(p + 1));
printf("%zu\n", strlen(*p));
printf("%zu\n", strlen(p[0]));
printf("%zu\n", strlen(&p));
printf("%zu\n", strlen(&p + 1));
printf("%zu\n", strlen(&p[0] + 1));
return 0;
}
解释:
3.二维数组
代码:
#include <stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%zu\n", sizeof(a));
printf("%zu\n", sizeof(a[0][0]));
printf("%zu\n", sizeof(a[0]));
printf("%zu\n", sizeof(a[0] + 1));
printf("%zu\n", sizeof(*(a[0] + 1)));
printf("%zu\n", sizeof(a + 1));
printf("%zu\n", sizeof(*(a + 1)));
printf("%zu\n", sizeof(&a[0] + 1));
printf("%zu\n", sizeof(*(&a[0] + 1)));
printf("%zu\n", sizeof(*a));
printf("%zu\n", sizeof(a[3]));
return 0;
}
解释:
注意:sizeof计算变量、数组的大小是,是通过内存推导的,不会真实访问内存空间
三.练习
例1:
include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
解释:
例2:
代码:
#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}
解释:
例3:
#include <stdio.h>
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
解释:
例4:
代码:
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
解释: