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

#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. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  2. 什么是jetty

    转自:http://www.cnblogs.com/eafy/archive/2007/10/24/906792.html 1. 简介 Jetty 是一个开源的servlet容器,它为基于Java的w ...

  3. Java的redis 操作类-优化通用版本

    java操作redis多节点处理方式;http://blog.itpub.net/29254281/viewspace-1188644/首先maven引入依赖包 <dependency> ...

  4. 后台进程弹Toast的几种方案

    在后台进程弹Toast,使用方案有:由UI线程传入一个Activity參数.View參数或者Handler參数,使用Activity.runOnUiThread(Runnable).View.post ...

  5. Myapplication的作用与理解

    1.前沿在设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Applic ...

  6. 【转】cocos2d-x游戏开发(八)各类构造器

    欢迎转载:http://blog.csdn.net/fylz1125/article/details/8521997 这篇写cocos2d-x的构造器. cocos2d-x引入自动释放机制后,创建的对 ...

  7. springMvc中406错误解决,springMvc使用json出现406 (Not Acceptable)

    springMvc中406错误解决, springMvc使用json出现406 (Not Acceptable) >>>>>>>>>>> ...

  8. svn项目冲突时显示无法加载项目的解决方法

    1.无法加载的项目会显示成灰色.这是右键点击编辑  打开后去掉乱字符. 2.完成后会有红色的叹号 这是右键 找到解决冲突即可 然后提交

  9. C# 事件的理解

    说实话,事件弄得还是很晕,有待于以后的强化吧,下面是我对事件的一点理解 首先,参见大牛的帖子:网上大牛事件讲解 下面我来说一说事件的大致流程: 事件委托事件概述事件就是当对象或类状态发生改变时,对象或 ...

  10. Gym 100187B-A Lot of Joy

    题意:给一个字符串,将每个字符分开放进两个口袋,每次从两个口袋分别拿出一个字符,如果相同则开心,问开心的次数期望是多少. 分析:数学期望题,然而这是我最不拿手的...最后答案是每个字符在字符串出现的次 ...