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

#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. 【Android - 基础】之PopupWindow的使用

    创建一个类继承自PopupWindow,编写自定义的PopupWindow类.示例代码如下: import android.app.Activity; import android.graphics. ...

  2. ECMAScript和JavaScript的联系

    ECMAScript是一种规范,一种标准.类似于编程语言的接口,定义好一套规范后,各大浏览器厂商遵循规范各自实现之,同时,也做了一些扩展,这些扩展就是规范里面没有的. JavaScript是一种实现, ...

  3. 使用val()方法设置表单中的默认选中项

    有时候我们展示给用户的表单中的checkbox,radio,selec等标签的一些项是默认选中的.比方:当用户改动文章的时候,假设相应的栏目为下拉框的话,那么它的默认选中值应该是原来的栏目位置. 能够 ...

  4. Lucene入门的基本知识(四)

    刚才在写创建索引和搜索类的时候发现非常多类的概念还不是非常清楚,这里我总结了一下. 1 lucene简单介绍  1.1 什么是lucene  Lucene是一个全文搜索框架,而不是应用产品.因此它并不 ...

  5. 使用选择器语法来查找元素 - 你想使用类似于CSS或jQuery的语法来查找和操作元素

    http://www.open-open.com/jsoup/selector-syntax.htm

  6. windows向ubuntu过渡之常用软件安装

    好久没有写博客了,介于最近上操作系统实验课,好多同学装上了ubuntu,网上的教程比较杂乱,下面我就总结分享一些安装完ubuntu要安装的常用软件,会持续更新... 1.搜狗拼音安装 (1)在安装输入 ...

  7. Linux强制踢出登录用户(断线账户剔除)

    首先,用w查看登录用户 :: up days, :, users, load average: 1.00, 1.01, 1.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU ...

  8. 复杂对象创建终结者(Builder Pattern)

    捣鼓了很长时间,终于对建造者模式有初步理解,现在写篇记录下.缘起就是创建的对象比较复杂,需按功能分散.类似造一辆汽车,作为汽车厂家,你需要造车身,造轮胎等,精髓在于领导者(Director),领导者指 ...

  9. fsdfasfsa

    http://www.cnblogs.com/daniel206/archive/2008/01/16/1041729.html using System.IO;using System.Net;us ...

  10. 程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...