C语言中的数组与指针的关系

有时候我们会使用sizeof(a)/sizeof(a[0]) 的方法来防止数组的下标超出有效下标。
然而,这种方法用于作为参数的数组却行不通,无法得到正确的数组个数。有的编译器还会给出一个警告来。

#include <stdio.h>
void prtf(int b[]){

    int i;
    for (i = 0; i < sizeof(b)/sizeof(b[0]); i++){
        printf("%d",b[i]);
    }
}

int main()
{
    int a[] = {1,3,5,7,10};
    prtf(a);
    return 0;
}

即使运行起来,也很容易发现程序并没按想像中的把135710 都打印出来,而是打印出了第一个数1
很显然,到这里sizeof(b)/sizeof(b[0]) 变成了1了。
试着在函数prtf() 中打印sizeof(b)sizeof(b[0]) 的值可以发现,两者的值是一样的。

void prtf(int b[]){
    printf("%d\n",sizeof(b));
    printf("%d\n",sizeof(b[0]));
}

而且都是4。
这是因为作为prtf 参数的 int b[] 实际上是一个指针。在32位平台上,一个指针的大小刚好与int的大小相等,都是四个字节。
所以,利用sizeof()便失效了。
通常在需要用到传进来的数组大小的函数里,会多加一个参数来得到数组大小。
于是,可以这样写:

#include <stdio.h>
void prtf(int b[], int length){

    int i;
    for (i = 0; i < length; i++){
        printf("%d",b[i]);
    }
}

int main()
{
    int a[] = {1,3,5,7,10};
    prtf(a,sizeof(a)/sizeof(a[0]));
    return 0;
}

这样便可以遍历数组了。
前面说到,int b[]其实是一个指针,也就是在函数参数里面,有
int b[] <==> int *b ,两者等价。
来验证一下这件事情:

//b[] 改成了 *b
void prtf(int *b, int length){
    int i;
    for (i = 0; i < length; i++){
        printf("%d",b[i]);
    }
}

程序依然正确运行。
当然,我们可以像操作数组一样操作指针,使用b[i]来进行操作。
举个栗子:

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

程序可以正确地输出1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值