C 语言函数参数只能传指针,不能传数组

  今天被要求编写一个C/C++冒泡算法的程序,心想这还不是手到擒来的事儿,虽然最近都是用Javascript程序,很少写C/C++程序,但是好歹也用过那么多年的C语言;

首先想的是怎么让自己的代码看上去更高大上一点,怎么着也得能自动识别数组的长度吧:于是第一版程序如下,结果如下

  看到结果,很是惊讶,为什么是2呢?看到后面我列出可执行文件的类型,应该知道,这个长度是指针的长度,64bit,刚好两个字节。说明sortof求得是指针的长度,而非数组的长度。

  仔细想想,函数的参数只能传递指针,不能直接传递数组;

  所以,要想传递数组,必须要传递数组首地址指针(通数组的类型一致),以及数组的长度,用来表示数组的结尾。

时间: 2024-08-24 12:33:18

C 语言函数参数只能传指针,不能传数组的相关文章

C语言 数组做函数参数退化为指针的技术推演

//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组做函数参数退化为指针的技术推演 void printfA(char * strarr[3]); //计算机中,数组都是线性存储,二维数组元素也是一个个的排列的 //例如: 1,2,3,4,5,6,7,8,9 像这组数据 我们可以认为是一维数组 int a[9]={1,2,3,4,5,6,7,8,9}; //也

关于函数传参--传指针,传引用

今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性. 先上代码,再分析. 代码1: void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } v

函数参数是二级指针的问题

实际应用中再一次遇到了函数参数是二级指针的问题,如下是正确的版本 void main(void) { //一级指针 uint8 *value_data_string = NULL; fun_change(&value_data_string ); printf((char *)value_data_string ); fun_free(&value_data_string ); } void fun_change(uint8 **tem_buf) { int value_len = 5;

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4  函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部参数名两种本文选自swift入门很简单. 7.4.1  本地参数名 本地参数名就是定义函数名时,在参数列表中所写的参数名,它只可以在函数主体内使用.如以下的一个代码片段,它定义了一个函数名为fun的函数,在此函数的参数列表中定义的就是本地参数名文选自swift入门很简单. func fun(star

菜鸟学习-C语言函数参数传递详解-结构体与数组

C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下,涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响. 例子: typedef struct tagSTUDENT{ char name[20]; int age; }STUDENT; void fun(STUDENT stu) { printf("stu.name=%s,stu.age=%d/

c语言数组做函数参数退化为指针

我的系统是MAC OS 64位.根据自己的系统位数不同是有差异的.以下是我学习过程中遇到的问题 大侠略过... 有时候我们想通过一个函数对数组的元素进行操作,在sizelen函数中想想通过sizeof获得数组的长度. 想法是好的,不要以为你对C语言很了解了.其实数组在做函数参数是只是传了,一个指针.也就是数组 的首地址. 从结果可以看出,C编译器确实是这么做得.我的系统是64位,所以int *是占8个字节. 以上只是我学习过程中遇到的问题.大侠略过...

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了. 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成? 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scan

C语言函数参数为空和void

C语言中函数参数的为空和用void标注他们的效果一样吗? #include <stdio.h>  2 //int add();  3 int add(void);  4 int main(void)  5 {  6     int i;  7     i = add(5 ,6);  8   9     printf("%d\n", i); 10     return 0; 11 } 12 int add(a ,b) 13 { 14     return a + b ; 15

c基础:函数参数是 struct(结构),传的是引用,还是值?

比如函数形式:void func(struct a data1, struct b data2); 答案: 只要不是指针或者数组都是传值,其实指针也是传递的地址值. 追问但是如果这个结构体里面有数组这种情况是怎么样的呢? 回答 如果结构体内有成员,也是原样按位拷贝,数组也是一样传值,除非用结构体数组,就又是传地址了.来自:http://zhidao.baidu.com/question/320802792.html我在今天之前,我还以为参数为struct时,传的是地址,我真菜, 2012-02-