指针数组进阶

目录

指针与数组中的sizeof与strlen

1、一维数组

整型数组

字符数组

指针数组

2、二维数组

指针笔试题 

笔试题1:

笔试题2:

笔试题3:

 笔试题4:

笔试题5:

前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽。接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧!

指针与数组中的sizeof与strlen

1、sizeof

sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作符。

2、strlen

strlen是计算字符串中\0之前出现了多少个字符,只针对字符串,是一个库函数。

3、数组名

数组名是数组首元素地址,但是在这里有两个例外:

(1)sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。

(2)&数组名,这里的数组名也表示整个数组,取出的是数组的地址

除了上面两种情况外,所有的数组名表示的都是数组首元素地址。

下面我们就来看一看数组、指针的一些运用

1、一维数组

整型数组

#include<stdio.h>
int main()
{
    //一维数组
    int a[] = {1,2,3,4};

    printf("%d\n",sizeof(a));// 16
    printf("%d\n",sizeof(a+0));// 4/8
    printf("%d\n",sizeof(*a));// 4
    printf("%d\n",sizeof(a+1));// 4/8
    printf("%d\n",sizeof(a[1]));// 4
    printf("%d\n",sizeof(&a));// 4/8
    printf("%d\n",sizeof(*&a));// 16
    printf("%d\n",sizeof(&a+1));// 4/8
    printf("%d\n",sizeof(&a[0]));// 4/8
    printf("%d\n",sizeof(&a[0]+1));// 4/8

    return 0;
}

接下来我们就一句一句讲解:

sizeof(a)

数组名a单独放在sizeof内部,计算的是整个数组的大小,单位是字节,所以计算结果:4*4=16个字节。

sizeof(a+0)

a没有单独存放,所以表示的是首元素的地址,a+0还是数组首元素的地址,是地址的话大小就是4/8个字节。(在32位环境下为4,64位环境下为8)

sizeof(*a)

a表示的是首元素的地址,*a就是对首元素的地址解引用,所以就是首元素,大小为4个字节

sizeof(a+1)

a表示首元素地址,a+1就是第二个元素的地址,是地址的话大小就是4/8个字节。

sizeof(a[1])

a[1]表示数组的第二个元素,大小是4个字节。

sizeof(&a)

&a表示的是整个数组的地址,数组的地址也是地址,所以大小为4/8个字节。

sizeof(*&a)

&a是数组的地址,类型是int(*)[4],是一个数组指针,如果解引用,访问的就是4个int的数组,可以理解为*与&抵消效果,所以*&a相当于a,所以sizrof(a)是16。

sizeof(&a+1)

&a是数组地址,&a+1跳过整个数组后的地址,是地址就是4/8个字节大小。

sizeof(&a[0])

&a[0]取出的是数组第一个元素的地址,是地址就是4/8个字节大小。

sizeof(&a[0]+1)

&a[0]+1就是第二个元素的地址,是地址大小就是4/8个字节。

字符数组

#include<stdio.h>
int main()
{
    //字符数组
    char arr[] = {'a','b','c','d','e','f'};

    printf("%d\n", sizeof(arr));// 6
    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

    printf("%d\n", strlen(arr));// 随机值
    printf("%d\n", strlen(arr+0));// 随机值
    printf("%d\n", strlen(*arr));// err
    printf("%d\n", strlen(a
  • 89
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 83
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱豆麻薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值