设为首页 加入收藏

TOP

C语言学习笔记(一):数组传递时退化为指针
2017-10-11 15:46:56 】 浏览:5498
Tags:语言学习 笔记 传递 时退 化为 指针

这几天闲来无事,写了一个数组元素排序函数如下:

#include <stdio.h>
#include <stdlib.h>
void ArraySort(int array[]); //数组元素从小到大排序

void ArraySort(int array[])
{
    int x,y,tmp;
    int i = sizeof(array) / 4; //获取数组长度为i
    for(x=0;x<i;x++)
    {
        for(y=x;y<i;y++)
        {
            if (array[x] > array[y])
                {
                    tmp = array[x];
                    array[x] = array[y];
                    array[y] = tmp;
                }
        }
     }      
     printf("从小到大排序:");
     for(x=0;x<i;x++)
     {
         printf("%d\t",array[x]);
     }
}


int main(void)
{
    int a[]={99,66,33,2,5,61,6};
    ArraySort(a);
    system("pause");
    return 0;
}

仔细检查一遍,没有warning没有error,应该可以实现排序的功能。结果呢:

问题来了,怎么只有一个呢?

第一反应就是 i 出现了问题,于是我查看了一下 i 的值:

这是什么原因呢? int i = sizeof(a) / 4;明显没有成功获取到数组的长度,sizeof(a)获取数组a的占用内存的字节 再除以每个int占用的字节(4)本该完全正确的! WTF?什么鬼!

本屌觉得不服,于是又重写了一段测试sizeof获取数组长度的代码:

#include <stdio.h>

int main(void)
{
    int array[] = {5, 4, 66, 23, 11, 44, 22, 361};
    int i = sizeof(array)/4;
    printf("数组长度为:%d\n", i);
    return 0;
}

编译运行后结果居然是这个样子的!!!

可见问题不是出在sizeof那里 我在思考是不是出现在函数实参与形参那里!

为什么在函数外可以获取,在函数里就不行?!

 

最后的结果就是我找到了这个:

 

If you want to pass a single-dimension array as an argument in a function, you would have to declare function formal parameter in one of following three ways and all three declaration methods produce similar results because each tells the compiler that an integer pointer is going to be received.

意思大概为传递一维数组时,编译器传递的不是数组,而是指针!

 

好吧!是在下输了,以此篇文章警示像我一样刚学习C语言的小白们在函数中传递数组的时候一定注意要在外面测数组长度,否则将会出BUG!

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇动态库和静态库同时存在时优先链.. 下一篇[转载]为什么使用%lf读取double型..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目