您的位置:首页 > 编程语言 > C语言/C++

C语言下数组做参数的退回问题探讨

2018-02-18 17:33 218 查看

C语言下数组做参数的退回问题探讨

一般书写传参形式,我们列举一般数值传参样例

// array.cpp: 定义控制台应用程序的入口点。
#include "stdafx.h"
int main(int argc, char **argv)
{
int arry[] = {5,8,2,0,3,1};
int i, j, tmp;

//查看当前数组状况
for (i = 0; i<6; i++)
{
printf("%d ", arry[i]);
}

printf("\n");
//冒泡排序
for (i = 0; i < 6; i++)
{
for(j=i+1; j<6; j++)
if (arry[i] > arry[j])
{
tmp = arry[i];
arry[i] = arry[j];
arry[j] = tmp;
tmp = 0;
}
}

//排序完成打印信息
for (i = 0; i<6; i++)
{
printf("%d ", arry[i]);
}
return 0;
}


一般我们会将一些比较复杂的代码抽象成函数,有

// array.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"

void print_array(int arry[], int num)
{
int i;
for (i = 0; i<num; i++)
{
printf("%d ", arry[i]);
}
}

void sort_array(int arry[], int num)
{
int i, j, tmp;

int num_cmp;
num_cmp = sizeof(arry) / sizeof(arry[0]);
printf("the num_cmp is %d\n",num_cmp);

for (i = 0; i < num; i++)
{
for (j = i + 1; j<num; j++)
if (arry[i] >= arry[j])
{
tmp = arry[i];
arry[i] = arry[j];
arry[j] = tmp;
tmp = 0;
}
}
}

int main(int argc, char **argv)
{
int arry[] = {5,8,2,0,3,1};
int num;

//查看当前数组状况
print_array(arry, num);
printf("\n");

num = sizeof(arry) / sizeof(arry[0]);
printf("the num is %d\n", num);

//冒泡排序
sort_array(arry,num);

//排序完成打印信息
print_array(arry,num);
printf("\n");

return 0;
}


注意到:

这里我多加了一个变量num_cmp,而且我们直接查看输出结果,发现,两个不一样。

the num is 6
5 8 2 0 3 1
the num_cmp is 1
0 1 2 3 5 8
请按任意键继续. . .


那我们直接改成指针形式昵?

发现生成的效果是一样的,这里很明显看出,主函数的num和函数里面的num_cmp不一样。

原因解释:

形参arry和实参arry的数据类型不一样

形参中的数组,编译器会把它当成指针处理,我们也通过改变成指针类型得到了验证。

c语言在主调函数与被调函数之间通过指针来操作内存

void print_array(int *arry, int num)
{
int i;
for (i = 0; i<num; i++)
{
printf("%d ", arry[i]);
}
}

void sort_array(int *arry, int num)
{
int i, j, tmp;

int num_cmp;
num_cmp = sizeof(arry) / sizeof(arry[0]);
printf("the num_cmp is %d\n",num_cmp);

for (i = 0; i < num; i++)
{
for (j = i + 1; j<num; j++)
if (arry[i] >= arry[j])
{
tmp = arry[i];
arry[i] = arry[j];
arry[j] = tmp;
tmp = 0;
}
}
}


结论:

数组做函数参数是会退回一个指针,把数组的内存首地址和数组有效长度传递给被调函数。

实参的数组和形参的数组的数据类型不一样,形参中的数组,编译器会把它当作指针处理

本质上,形参写在函数上同和写在函数内,只不过具有对外属性。

特别标注:本篇博客来自传智播客学习所记录笔记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: