请问一个C语言中sizeof的有关问题

请教一个C语言中sizeof的问题
这是一个冒泡排序,问题是:我想用sizeof求数组的大小,但是得到的答案b是2而非5. 请问为什么,请教改进方法(注释段是我本来的方法)请问一个C语言中sizeof的有关问题

#include<stdio.h>
void sort(int a[]){
int temp,n,m;
//  int b=sizeof(a)/sizeof(int);利用这段求数组大小
int b=4;
for(n=0;n<b;n++){
for(m=0;m<b-n;m++){
if(a[m]>a[m+1]){
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
int main(){
int a[5]={12,1,22,3,5};
sort(a);
return 0;
}



------解决方案--------------------

#include<stdio.h>
void sort(int a[], int num){
    int temp,n,m;
//  int b=sizeof(a)/sizeof(int);利用这段求数组大小
    int b=num;
    for(n=0;n<b;n++){
        for(m=0;m<b-n;m++){
            if(a[m]>a[m+1]){
                temp=a[m];
                a[m]=a[m+1];
                a[m+1]=temp;
            }
        }
    }
    for(n=0;n<5;n++){
        printf("%d\t",a[n]);
    }
    printf("\n");
}
int main(){
    int a[5]={12,1,22,3,5};
    sort(a, sizeof(a)/sizeof(int));
    return 0;
}


数组做参数的时候,就成指针了。
------解决方案--------------------
怎么可能,我试了一下都是5
------解决方案--------------------
数组做参数弱化为指针,所以在函数sort中 sizeof(a) == sizeof(int*)
------解决方案--------------------
void fsort (int a[], int len);

------解决方案--------------------
#include<stdio.h>
void sort(int (&a)[5])
{
int temp,n,m;
 int b=sizeof(a)/sizeof(int);//这段求数组大小
//t b=4;
for(n=0;n<b;n++)
{
for(m=0;m<b-n;m++)
{
if(a[m]>a[m+1])
{
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
int main(){
int a[5]={12,1,22,3,5};
sort(a);
return 0;
}



用c++编译器试试
------解决方案--------------------
在进行函数传参时,你传递的只是数组的首地址而已,并没有将整个数组传过去,你的函数形参列表不论是 *p还是p[],都当做*p来看,所以sizeof(p)==4;
------解决方案--------------------
a作为数组名,类型应该是指针吧。sizeof求的是该类型内存大小,整形占4个字节,指针在不同的平台上占大小不同,64位机应该就是8个字节,得到的是2。而32位机占8个字节,得到的是1。
------解决方案--------------------
gcc编译器下如果这样写的话,你把数组名a传进去的话,我可以告诉你,b的值一定是1;
为什么呢?
因为数组名做形参的时候,传进来的数组a就是个数组a的地址,你用sizeof(b)得到的是一个指针变量的大小(32位系统下是是4字节,64位系统下是8字节),所以你获取的是b值是1;
而如果你在数组中需要用到数组的大小,在给sort函数天剑一个数组大小的int参数,可以在main函数中用sizeof(a)获取后传给这个参数即可。
------解决方案--------------------
引用:
a作为数组名,类型应该是指针吧。sizeof求的是该类型内存大小,整形占4个字节,指针在不同的平台上占大小不同,64位机应该就是8个字节,得到的是2。而32位机占8个字节,得到的是1。
你这样说不太对吧,很简单,你定义一个数组int a[10];
sizeof(a)/sizeof(a[0])肯定是10,但若函数的形参为数组,实际上是当做指针来处理的,情况就不一样了
------解决方案--------------------
数组在作为函数参数时退化为指针,int b=sizeof(a)/sizeof(int);利用这段求数组大小是错误的,应该在添加个参数来指定数组长度。
#include<stdio.h>
void sort(int a[] ,int b){
    int temp,n,m;
    for(n=0;n<b;n++){
        for(m=0;m<b-n;m++){
            if(a[m]>a[m+1]){
                temp=a[m];
                a[m]=a[m+1];
                a[m+1]=temp;
            }
        }
    }
    for(n=0;n<5;n++){
        printf("%d\t",a[n]);
    }
    printf("\n");
}
------解决方案--------------------
如果能够计算数组的大小,那在排序时还要传入数组长度干什么呢请问一个C语言中sizeof的有关问题
------解决方案--------------------
数组作参数,传递的是指针,所以sizeof(a)是等于4的。