C语言指针理解---一维数组作函数参数的用法

简介: C语言指针理解---一维数组作函数参数的用法

一维数组做函数参数的用法:

  1. 当一维数组做函数参数的时候,会退化为指针
  2. 一维数组做函数参数的时候,c/c++编译器会做优化

                  int a[10]  ----->int a[] ---->int *a

                  所以数组作函数参数的时候只能传指针

   3.函数调用的时候,把数组首地址和有效数据长度传给被调用函数才是最正确的做法

 

//在函数调用哪个的时候 实参的值机械的传给形参(c int数组场景)

关于形参的理解:

        写在函数上形参变量,还是写在函数里面的变量,

        从CC++编译的角度来讲,是没有任何区别的(分配4字节内存);

        只不过是 写在函数上形参变量 ,具有对外的属性而已

 

下面给出程序具体实例

1. #include "stdlib.h"
2. #include "string.h"
3. #include "stdio.h"
4. 
5. //当数组当做函数参数的话的时候会退化为指针 
6. int printfArray(int a[]) //这里形参a[10]跟a[]效果一样
7. {
8.  int i = 0;
9.  int num = 0;
10. 
11.   num = sizeof(a) / sizeof(*a);  //这里num值为1
12.   printf("num=%d.\n", num);
13.   for (i = 0; i < 10; i++)
14.   {
15.     printf("%d ", a[i]);
16.   }
17.   printf("\n");
18.   return 0;
19. }
20. 
21. //int a[10]  -=-->int a[] ---->int *a
22. //数组做函数形参的时候,如果在形参中定义int a[10]语句,
23. //c/c++编译器 会做优化,技术推演如下
24. //int a[10]  -=-->int a[] ---->int *a
25. //总结:函数调用的时候,把数组首地址和有效数据长度传给被调用函数才是最正确的做法
26. //在函数调用哪个的时候 实参的值机械的传给形参(c int数组场景)
27. 
28. //关于形参:
29. /*
30.     写在函数上形参变量,还是写在函数里面的变量,
31.     从CC++编译的角度来讲,是没有任何区别的(分配4字节内存);
32.     只不过是 写在函数上形参变量 ,具有对外的属性而已
33. */
34. 
35. 
36. int printfArray04(int *a, int num)
37. {
38.   int i = 0;
39.   for (i = 0; i < num; i++)
40.   {
41.     printf("%d ", a[i]);
42.   }
43.   printf("\n");
44.   return 0;
45. 
46. }
47. 
48. 
49. int sortArray(int a[])
50. {
51.   int i = 0, j = 0;
52.   int tmp;
53.   for (i = 0; i < 10; i++) //外层循环
54.   {
55.     for (j = i + 1; j < 10; j++) //内层循环
56.     {
57.       if (a[i] > a[j])
58.       {
59.         tmp = a[i];
60.         a[i] = a[j];
61.         a[j] = tmp;
62.       }
63.     }
64.   }
65.   return 0;
66. }
67. void main()
68. {
69.   //定义数组 打印数组 数组排序
70.   int i = 0, j = 0;
71.   int num2;
72.   int a[10] = { 1,3,4,5,65,76,7,34,4,32 };
73.   int tmp;
74. 
75.   num2 = sizeof(a) / sizeof(*a); //这里num2值为10
76.   printf("num2:%d \n", num2);
77. 
78.   printf("排序之前\n ");
79.   printfArray04(a, 10);
80.   sortArray(a);
81. 
82.   printf("排序之后\n ");
83.   printfArray(a);
84. 
85.   system("pause");
86. }
相关文章
|
9月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
437 2
|
10月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1557 0
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
511 15
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
676 1
一文彻底搞清楚C语言的函数
|
存储 C语言
指针的函数传参的详细讲解(一)
本文介绍了计算机内存管理与C语言中指针的基本概念及应用。从内存单元的划分到指针的定义,解释了指针作为地址的作用及其数据类型特性。文章通过代码示例详细说明了一级指针、二级指针的使用方法,以及`void*`指针的特点和限制。此外,还探讨了指针运算规则、函数指针传参解引用的原理,并结合链表实例分析了一级与二级指针在实际场景中的区别。最后附带两道指针练习题,帮助读者巩固理解。
293 0
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
897 0
一文彻底搞明白C语言的数组
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
851 16
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
738 3
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
971 2
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
815 1