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

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

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

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

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

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

 

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

关于形参的理解:

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

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

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

 

下面给出程序具体实例

#include "stdlib.h"
#include "string.h"
#include "stdio.h"

//当数组当做函数参数的话的时候会退化为指针 
int printfArray(int a[]) //这里形参a[10]跟a[]效果一样
{
	int i = 0;
	int num = 0;

	num = sizeof(a) / sizeof(*a);  //这里num值为1
	printf("num=%d.\n", num);
	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

//int a[10]  -=-->int a[] ---->int *a
//数组做函数形参的时候,如果在形参中定义int a[10]语句,
//c/c++编译器 会做优化,技术推演如下
//int a[10]  -=-->int a[] ---->int *a
//总结:函数调用的时候,把数组首地址和有效数据长度传给被调用函数才是最正确的做法
//在函数调用哪个的时候 实参的值机械的传给形参(c int数组场景)

//关于形参:
/*
		写在函数上形参变量,还是写在函数里面的变量,
		从CC++编译的角度来讲,是没有任何区别的(分配4字节内存);
		只不过是 写在函数上形参变量 ,具有对外的属性而已
*/


int printfArray04(int *a, int num)
{
	int i = 0;
	for (i = 0; i < num; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;

}


int sortArray(int a[])
{
	int i = 0, j = 0;
	int tmp;
	for (i = 0; i < 10; i++) //外层循环
	{
		for (j = i + 1; j < 10; j++) //内层循环
		{
			if (a[i] > a[j])
			{
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}
	return 0;
}
void main()
{
	//定义数组 打印数组 数组排序
	int i = 0, j = 0;
	int num2;
	int a[10] = { 1,3,4,5,65,76,7,34,4,32 };
	int tmp;
	
	num2 = sizeof(a) / sizeof(*a); //这里num2值为10
	printf("num2:%d \n", num2);

	printf("排序之前\n ");
	printfArray04(a, 10);
	sortArray(a);

	printf("排序之后\n ");
	printfArray(a);

	system("pause");
}

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/89213123