C · 进阶 | 指针和数组超细节笔试题解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: - 指针和数组结合在一起历来是`C语言`里面的难点,细节多如牛毛,今天博主就专门出一篇文章领略一下,专门总结了几乎所有细节部分,让我们开启沉浸式练习- 本系列分两个板块,前半部分直接上题,后半部分会有相应的解析

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


@TOC


前言

  • 指针和数组结合在一起历来是C语言里面的难点,细节多如牛毛,今天博主就专门出一篇文章领略一下,专门总结了几乎所有细节部分,让我们开启沉浸式练习
  • 本系列分两个板块,前半部分直接上题,后半部分会有相应的解析

指针和数组笔试题解析

1. 一维数组

1.1 整型数组

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));

1.2 字符数组

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));
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));
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));
char arr[] = "abcdef";
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));

2. 二维数组

2.1 整型数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
  • ==铁汁们加油!仔细刷题==

3. 一维数组解析

3.1 整型数组解析

    int a[] = { 1,2,3,4 };

    printf("%d\n", sizeof(&a + 1));//4/8
    //&a取出的是数组的地址
    //&a-->  int(*)[4]
    //&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小
    //&a+1还是地址,是地址就是4/8字节
    //
    printf("%d\n", sizeof(&a[0]));//4/8
    //&a[0]就是第一个元素的地址
    //计算的是地址的大小
    printf("%d\n", sizeof(&a[0] + 1));//4/8
    //&a[0]+1是第二个元素的地址
    //大小是4/8个字节
    //&a[0]+1 ---> &a[1]
    //

    printf("%d\n", sizeof(a));//16
    //sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
    printf("%d\n", sizeof(a + 0));//4
    //a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址
    //是地址,大小就是4/8个字节
    printf("%d\n", sizeof(*a));//4
    //*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
    //首元素的大小就是4个字节
    printf("%d\n", sizeof(a + 1));
    //这里的a是数组首元素的地址
    //a+1是第二个元素的地址
    //sizeof(a+1)就是地址的大小
    printf("%d\n", sizeof(a[1]));//4
    //计算的是第二个元素的大小
    printf("%d\n", sizeof(&a));//4/8
    //&a取出的数组的地址,数组的地址,也就是个地址
    printf("%d\n", sizeof(*&a));//16
    //&a----> int(*)[4]
    //&a拿到的是数组名的地址,类型是 int(*)[4],是一种数组指针
    //数组指针解引用找到的是数组
    //*&a ---> a
    //
    //2.
    //&和*抵消了
    //*&a ---> a
    //

3.2 字符数组解析

    char arr[] = { 'a','b','c','d','e','f' };
    printf("%d\n", sizeof(arr));//6
    //sizeof(数组名)
    printf("%d\n", sizeof(arr + 0));//4/8
    //arr + 0 是数组首元素的地址
    printf("%d\n", sizeof(*arr));//1
    //*arr就是数组的首元素,大小是1字节
    //*arr --> arr[0]
    //*(arr+0) --> arr[0]
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    //&arr是数组的地址,是地址就是4/8个字节
    printf("%d\n", sizeof(&arr + 1));//4/8
    //&arr + 1是数组后的地址
    //
    printf("%d\n", sizeof(&arr[0] + 1));//4/8
    //&arr[0] + 1是第二个元素的地址
    //
    char arr[] = { 'a','b','c','d','e','f' };

    printf("%d\n", strlen(arr));//随机值
    printf("%d\n", strlen(arr + 0));//随机值

    printf("%d\n", strlen(*arr));//--> strlen('a');-->strlen(97);//野指针
    printf("%d\n", strlen(arr[1]));//-->strlen('b')-->strlen(98);

    printf("%d\n", strlen(&arr));//随机值
    printf("%d\n", strlen(&arr + 1));//随机值-6
    printf("%d\n", strlen(&arr[0] + 1));//随机值-1
    char arr[] = "abcdef";
    //[a b c d e f \0]
    printf("%d\n", sizeof(arr));//7
    printf("%d\n", sizeof(arr + 0));//4/8
    printf("%d\n", sizeof(*arr));//1
    printf("%d\n", sizeof(arr[1]));//1
    printf("%d\n", sizeof(&arr));//4/8
    printf("%d\n", sizeof(&arr + 1));//4/8
    printf("%d\n", sizeof(&arr[0] + 1));//4/8
    char arr[] = "abcdef";
    //strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数
    //strlen是库函数,只针对字符串
    //sizeof只关注占用内存空间的大小,不在乎内存中放的是什么
    //sizeof是操作符
    //
    //[a b c d e f \0]
    printf("%d\n", strlen(arr));//6
    printf("%d\n", strlen(arr + 0));//6
    printf("%d\n", strlen(*arr));//err
    printf("%d\n", strlen(arr[1]));//err
    printf("%d\n", strlen(&arr));//6
    printf("%d\n", strlen(&arr + 1));//随机值
    printf("%d\n", strlen(&arr[0] + 1));//5

4. 二维数组解析

4.1 整型数组解析

    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(a[0][0]));
    printf("%d\n", sizeof(a[0]));
    //a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组
    //sizeof(a[0])计算的就是第一行的大小
    printf("%d\n", sizeof(a[0] + 1));
    //a[0]并没有单独放在sizeof内部,也没取地址,a[0]就表示首元素的地址
    //就是第一行这个一维数组的第一个元素的地址,a[0] + 1就是第一行第二个元素的地址
    printf("%d\n", sizeof(*(a[0] + 1)));
    //a[0] + 1就是第一行第二个元素的地址
    //*(a[0] + 1))就是第一行第二个元素
    printf("%d\n", sizeof(a + 1));//4/8
    //a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址
    //a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址
    //a+1就是跳过第一行,表示第二行的地址
    printf("%d\n", sizeof(*(a + 1)));//16
    //*(a + 1)是对第二行地址的解引用,拿到的是第二行
    //*(a+1)-->a[1]
    //sizeof(*(a+1))-->sizeof(a[1])
    //
    printf("%d\n", sizeof(&a[0] + 1));//4/8
    //&a[0] - 对第一行的数组名取地址,拿出的是第一行的地址
    //&a[0]+1 - 得到的是第二行的地址
    //
    printf("%d\n", sizeof(*(&a[0] + 1)));//16
    printf("%d\n", sizeof(*a));//16
    //a表示首元素的地址,就是第一行的地址
    //*a就是对第一行地址的解引用,拿到的就是第一行
    //
    printf("%d\n", sizeof(a[3]));//16
    printf("%d\n", sizeof(a[0]));//16

    //int a = 10;
    //sizeof(int);
    //sizeof(a);

在这里插入图片描述

相关文章
|
2天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
2天前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
2天前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
3天前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
11 4
|
2天前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
3天前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
10 2
|
3天前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
7 1
|
3天前
|
Serverless C语言
【C语言】:对(一维)数组与指针的深入理解(1)
【C语言】:对(一维)数组与指针的深入理解(1)
8 1
|
7天前
|
搜索推荐
指针进阶(2)
指针进阶(2)
26 4
|
9天前
|
存储 算法 安全
C++一分钟之-数组与指针基础
【6月更文挑战第19天】在C++中,数组和指针是核心概念,数组是连续内存存储相同类型的数据,而指针是存储内存地址的变量。数组名等同于指向其首元素的常量指针。常见问题包括数组越界、尝试改变固定大小数组、不正确的指针算术以及忘记释放动态内存。使用动态分配和智能指针可避免这些问题。示例代码展示了安全访问和管理内存的方法,强调了实践的重要性。
25 3

推荐镜像

更多