指针与地址(2),看完真的弄懂了

文章探讨了C语言中指针与sizeof运算符的使用,通过实例解析了数组、指针及地址在sizeof运算下的结果。指针加法、解引用的概念被重点解释,并通过不同代码示例展示了sizeof运算符在不同情况下的行为,包括对数组、指针变量及其解引用后的大小计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一期文章中我们谈到指针与地址,文章的末尾我们交给大家两个问题,现在我们就这两个问题给大家分析一下

#include<stdio.h>
int main()
{
    int a[4]={1,2,3,4};
    printf("%d",sizeof(*&a));
    printf("%d",sizeof(&a+1));
    printf("%d",sizeof(&a[0]+1));
    return 0;
}

首先三个printf的输出值应该是16,4/8,4/8

我们知道&后加数组名表示整个数组的地址,对整个数组的地址进行解引用得到整个数组的大小为16。

同样的道理,但是为什么第二个输出的结果会是4/8呢?

在这里我们应该明白&a+1代表什么,它表示在整个数组a的地址上加1,表示跨过一个数组a,到达下一个跟数组a相邻的地址,因为是地址所以大小为4/8

 由图示我们可以知道&a+1跨过一个a数组,所以它跨过的大小是16字节

同理我们就可以理解第三个sizeof中跨过了数组a中的一个元素,取到a[0]的下一个元素的地址

 明白了以上内容之后我们正式开始我们的第二篇内容

#include<stdio.h>
int main()
{
    char arr[]={'a','b','c','d','e','f'};
    printf("%d",sizeof(arr));
    printf("%d",sizeof(arr+0));         
    printf("%d",sizeof(*arr));
    printf("%d",sizeof(arr[1]));
    printf("%d",sizeof(&arr));
    printf("%d",sizeof(&arr+1));
  return 0;
} 

有了上篇文章的基础这道题我们可以很容易的解答,只需要明白char占据一个字节

那么请大家看以下代码

#include<stdio.h>
int main()
{
    char *p="abcde";
    printf("%d",sizeof(p));
    return 0;
}

这个代码的输出值是4,为什么呢?

我们知道sizeof加数组名表示整个数组大小,此时的情况表示的是数组首元素的地址,既然是地址那么大小就应该是4

这里值得注意的是虽然指针的类型char*,但是我们此时输出的是地址,地址无论何种数据都是四个字节

#include<stdio.h>
int main()
{
    char *p="abcde";
    printf("%d",sizeof(p+1));
    return 0;
}

明白了上面的一个代码后,我们来看这个代码

这个代码的输出值同样是4,原因同上面一个代码,但是这里同样也有一个值得我们关注的点就是p+1表示的是什么,我们已经知道p表示的是首元素的地址,那么p+1就应该表示的是第二个元素的地址

#include<stdio.h>
int main()
{
    char *p="abcde";
    printf("%d",sizeof(*p));
    return 0;
}

有了以上分析,我们来看一下这个代码,p表示首元素地址,对首元素地址进行解引用得到首元素,因为是char型,所以首元素的大小是1个字节

#include<stdio.h>
int main()
{
    char *p="abcde";
    printf("%d",sizeof(p[0]));
    return 0;
}

那么这个代码输出的值是多少呢?

相信学习过指针后大家应该明白p[0]=*(p+0)那么此时输出的结果应该已经显而易见了,就表示对首元素地址进行解引用,所以输出的结果应该是1

同上一期文章一样本期文章的末尾我们也要给大家几个问题,大家自行研究之后我们在下一期文章中给大家详细解答

#include<stdio.h>
int main()
{
    char *p="abcde";
    printf("%d",sizeof(&p));
    printf("%d",sizeof(&p+1));
    printf("%d",sizeof(&p[0]+1));
    return 0;
}

文章到此结束,谢谢大家的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值