「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。
前面我们已经详细学习过了指针与数组,为了巩固所学,我们来几道题目练练手
题目一:
int main()
{ //数组名是首元素的地址
//1.sizeof(数组名) - 数组名表示整个数组
//2.&数组名 - 数组名表示整个数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a + 1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0]+1));
return 0;
}
解析:
//数组名是首元素的地址
//1.sizeof(数组名) - 数组名表示整个数组
//2.&数组名 - 数组名表示整个数组
//sizeof(数组名) - 计算的是数组总大小 - 单位是字节 - 16
//4 - 数组名这里表示首元素地址,a+0还是首元素地址,地址大小就是4/8个字节
//4 - 数组名表示首元素地址,*a就是首元素,sizeof(*a)就是4
//4 - 数组名这里表示首元素地址,a+1是第二个元素的地址,地址的大小就是4/8个字节
//4 - 第二个元素的大小
//4 &a取出的是数组的地址,但是数组的地址也是地址,地址的大小就是4/8个字节
//16 - &a是数组的地址,数组的地址解引用访问数组,sizeof计算的就是数组的大小,单位是字节
//4/8 &a是数组的地址,&a+1虽然地址跳过整个数组,但还是地址
//4/8 &a[0]是第一个元素的地址
//4/8 第二个元素的地址
题目二:
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
解析:
// 6 sizeof计算的是数组大小 6*1=6
//4/8 arr是首元素的地址,arr+0还是首元素的地址 地址的大小是4/8字节
//1 arr是首元素地址,*arr是首元素,首元素是字符,大小是一个字节
//1
//4 &arr虽然是数组的地址,但还是地址,地址的大小是4/8个字节
//4 &arr+1是跳过整个数组后的地址,地址大小是4/8个字节
//4 第二个元素的地址
题目三:
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
//随机值 \0的位置不确定
//随机值
//err
//err
//随机值
//随机值
//随机值
//随机值
题目四:
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
return 0;
}
解析:
//7 a b c d e f \0 7个字符 7*1=7 sizeof计算的数组的大小。单位是字节
//4/8计算的是地址的大小 arr+0是首元素的地址
//1 *arr是首元素,sizeof(*arr)计算首元素大小
//1 arr[1]是第二个元素,sizeof(arr[1])计算的是第二个元素的大小
//4 &arr虽然是数组的地址,但也是地址,所以是4/8个字节
//4/8 &arr+1是跳过整个数组后的地址,但也是地址
// 4/8 &arr[0]+1 第二个元素的地址