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

#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=;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=;x<i;x++)
{
printf("%d\t",array[x]);
}
} int main(void)
{
int a[]={,,,,,,};
ArraySort(a);
system("pause");
return ;
}

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

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

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

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

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

#include <stdio.h>

int main(void)
{
int array[] = {, , , , , , , };
int i = sizeof(array)/4;
printf("数组长度为:%d\n", i);
return ;
}

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

可见问题不是出在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!

C语言学习笔记(一):数组传递时退化为指针的更多相关文章

  1. c语言学习笔记 函数数组传递笔记

    今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...

  2. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  3. Go语言学习笔记(4)——数组和切片

    1 数组的特点: 长度固定.元素数据类型相同.下标从0开始 1.1 声明和初始化: var array_name [size] type         var arr1 [10] float32   ...

  4. C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  5. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  6. go语言学习笔记之数组

    package main import ( "fmt" ) func main() { // Declare arrays var x[5] int //Assign value ...

  7. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  8. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  9. Go语言学习笔记(1)——顺序编程

    Go语言学习笔记这一堆主要是<Go语言编程>(人民邮电出版社)的读书笔记.中间会穿插一些零碎的点,比如源码学习之类的.大概就是这样吧. 1. 顺序编程 1.1 变量 变量的声明: var ...

随机推荐

  1. String和StringBuilder作为参数的区别

    先见下面实例: public class TestDemo { @Test public void test(){ //String str = "hello"; String s ...

  2. Shell脚本高级应用 --实现远程MySQL自动查询[转

    #!/bin/sh Host=192.168.5.30 User=abccdef PW=123456 MSG=`mysql -h$Host -u$User -p$PW <<EOF show ...

  3. mac下教你如何开源项目托管GitHub

    自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 这里教大家如何把代码库上传到G ...

  4. 站在巨人的肩膀上学习Android开发

    我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...

  5. [D3] 2. Basics of SVG

    1. svg should use 'fill' prop instead 'background-color'2. svg width & height no need 'px'3. att ...

  6. 【Qt】测测你对Qt的了解–Qt工具知多少

      原文:http://blog.163.com/lijiji_1515/blog/static/1268774462009103101944455/   你知道Qt都提供了哪些工具吗? 你知道Qt的 ...

  7. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  8. iOS网络层架构设计分享

    前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...

  9. C++ 读取XML文件(tinyXML库的应用)

    C++读取xml有很多第三方的xml解析库,最近使用tinyxml库来解析,下面直接上应用例子: Skin.xml文档内容如下: <UI> <Image name="ban ...

  10. C# 日期之间的间隔

    今天工作中,突然遇到要计算两个时间之间的天数,最后把自己的方法记录下来,其实挺简单的: DateTime dt1=Convert.ToDateTime("2014/8/1 23:53:31& ...