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天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
34 6
|
12天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
26天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
31 6
|
1月前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
2月前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
20 2
|
2月前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
32 0
|
2月前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
23 0
|
7月前
|
C语言
C语言---指针进阶
C语言---指针进阶
50 0
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
59 1
|
编译器 C语言
C语言指针进阶(上)
C语言指针进阶(上)
103 1