评论

收藏

[C++] c语言_Day30_07_31

编程语言 编程语言 发布于:2021-07-31 21:31 | 阅读数:506 | 评论:0

c语言_Day30_07_31
1、指针和数组笔试题
1、大小问题

  • 一维整形数组
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));  // 16
printf("%d\n", sizeof(a + 0));  // 4
printf("%d\n", sizeof(a)); // 4
printf("%d\n", sizeof(a + 1));  // 4
printf("%d\n", sizeof(a[1]));   // 4
printf("%d\n", sizeof(&a)); // 4
printf("%d\n", sizeof(&a));  // 16
printf("%d\n", sizeof(&a + 1)); // 4
printf("%d\n", sizeof(&a[0]));  // 4
printf("%d\n", sizeof(&a[0] + 1));  // 4
return 0;
}
sizeof(数组名) --- 数组总大小
sizeof(地址) --- 4或8字节
注:数组名为数组首元素的地址,但存在两个例外

  • sizeof返回整个数组大小
  • &数组名 种数组名表示整个数组

  • 一维字符数组
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));  // 6
printf("%d\n", sizeof(arr + 0));  // 4
printf("%d\n", sizeof(*arr));   // 1
printf("%d\n", sizeof(arr[1])); // 1
printf("%d\n", sizeof(&arr));   // 4
printf("%d\n", sizeof(&arr + 1));   // 4
printf("%d\n", sizeof(&arr[0] + 1));  // 4
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));  // 随机
char str[] = "abcdef";
printf("%d\n", sizeof(str));  // 7
printf("%d\n", sizeof(str + 0));  // 4
printf("%d\n", sizeof(str));   // 1
printf("%d\n", sizeof(str[1])); // 1
printf("%d\n", sizeof(&str));   // 4
printf("%d\n", sizeof(&str + 1));   // 4
printf("%d\n", sizeof(&str[0] + 1));  // 4
printf("%d\n", strlen(str));  // 6
printf("%d\n", strlen(str + 0));  // 6
printf("%d\n", strlen(str[1])); // 程序崩溃
printf("%d\n", strlen(*str));   // 程序崩溃
printf("%d\n", strlen(&str));   // 6
printf("%d\n", strlen(&str + 1));   // 随机
printf("%d\n", strlen(&str[0] + 1));  // 5
return 0;
}
strlen函数读到'\0'返回前面的字符个数,传入非法地址会导致程序崩溃

  • 字符指针
char p = "abcdef";
printf("%d\n", sizeof(p));  // 4
printf("%d\n", sizeof(p + 1));  // 4
printf("%d\n", sizeof(p)); // 1
printf("%d\n", sizeof(p[0]));   // 1
printf("%d\n", sizeof(&p + 1)); // 4
printf("%d\n", sizeof(&p[0] + 1));  // 4
printf("%d\n", strlen(p));  // 6
printf("%d\n", strlen(p + 1));  // 5
printf("%d\n", strlen(*p)); // err
printf("%d\n", strlen(p[0]));   // err
printf("%d\n", strlen(&p + 1)); // 随机
printf("%d\n", strlen(&p[0] + 1));  // 5

  • 二维数组
int arr[3][4] = { 0 };
printf("%d\n", sizeof(arr));  // 48
printf("%d\n", sizeof(arr[0][0]));  // 4
printf("%d\n", sizeof(arr[0])); // 16
printf("%d\n", sizeof(arr[0] + 1)); // 4
printf("%d\n", sizeof((arr[0] + 1)));  // 4
printf("%d\n", sizeof(arr + 1));  // 4
printf("%d\n", sizeof((arr + 1))); // 16
printf("%d\n", sizeof(&arr[0] + 1));  // 4
printf("%d\n", sizeof(*(&arr[0]+1)));   // 16
printf("%d\n", sizeof(*arr));   // 16
printf("%d\n", sizeof(arr[3])); // 16
sizeof(arr)把数组名单独放入sizeof内,计算第i行的数组大小
注:sizeof内部表达式不实际计算,仅根据类型计算大小,故其表达式内部的数组越界访问不会报错

关注下面的标签,发现更多相似文章