指针与地址(1),看完真的弄懂啦!

文章详细解释了在C语言中,数组名在不同情况下的含义,特别是sizeof运算符的应用。它指出sizeof后跟数组名表示整个数组的大小,而sizeof后跟指针(如*a或*&a)则表示单个元素或指针本身的大小。文章通过示例代码展示了这些概念,包括sizeof(&a)返回地址的大小(4个字节)。最后,文章提出了更复杂的表达式供读者思考,如sizeof(*&a),sizeof(&a+1)和sizeof(&a[0]+1),并预告将在后续文章中讨论。

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

在阅读本文章之前,我们应该先明白三点基本的内容。

我们都知道数组名表示首元素地址,但是一下两种情况的数组名表示的是整个数组

1.sizeof后加数组名表示整个数组,计算整个数组的大小

2.&后加数组名表示整个数组的地址

需要我们特别注意的是除了以上两种情况之外其余情况均表示数组首元素。

弄清楚以上的关系之后我们来看一个简单的代码

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

根据我们刚才所讲的内容很容易明白此时输出的结果应该是16,

#include<stdio.h>
int main()
{
    int a[4]={1,2,3,4};
    printf("%d",sizeof(a+0));//此时sizeof后面已经不是单纯的数组名而是有其他符号
    return 0;
}

那么此时的输出结果应该是多少呢?

由上文我们可以知道此时的结果应该是4/8在32位架构中是4在64位架构中是8

如果你已经理解了上述的情况那么下面一种情况的结果应该是多少呢?

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

根据我们前两段所了解的,此时应该输出的是4/8

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

那么这个代码输出的结果应该是什么呢?

我们知道&+数组名表示整个数组的地址,所以自然有同学觉得此时应该输出16,

但是我们要明白的是&之后无论如何已经变成了地址,在计算机中我们要明白一个地址的大小是4个字节,所以此处输出的结果是4。

通过上述四段代码的学习,是否已经弄懂了指针和地址的关系了呢?

接下来我们看一段更加复杂的代码

#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;
}

那么上面三个代码的输出值应该是什么呢?

此处我们留给读者自行解决,并会在下一期文章中讲解。

如果弄明白了以上的3个结果我们不妨再思考一个问题

第二个sizeof中到底表示的是什么呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值