laiyuou 发表于 2021-11-7 11:27

学习c语言的第二天:关于数组名作为函数参数的一些学习

#include<stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS

//数组名作函数的参数:
//知道了指针变量之后,其实数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,
////形参得到该地址后也指向同一数组。同样的,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用
//
//float aver(float *pa);
//
//int main()
//{
//        float sco, av, *sp;
//        int i;
//        sp = sco;
//        printf("\ninput 5 scores:\n");
//        for (i = 0; i < 5; i++)
//        {
//                scanf_s("%f", &sco);
//                av = aver(sp);
//        }
//        printf("averge score is %5.2f\n", av);
//        return 0;
//
//}
//float aver(float *pa)
//{
//        int i;
//        float av, s = 0;
//        for (i = 0; i < 5; i++)
//        {
//                s = s + *pa++;
//        }
//        av = s / 5;
//        return av;
//}

//例子:将数组a中的n个整数按相反顺序存放

//void inv(int x[], int n)
//{
//        int temp, i, j, m = (n-1)/2;
//        for (i = 0; i < m; i++)
//        {
//                j = n - 1 - i;
//                temp = x; x = x; x = temp;
//        }
//        return ;
//}
//
//int main()
//{
//        int i, a = { 0,1,2,3,4,5,6,7,8,9 };
//        printf("The original array is:\n");
//        for (i = 0; i < 10; i++)
//        {
//                printf("a[%d]=%d\n", i, a);
//        }
//        inv(a, 10);
//        printf("The array has been inverted:\n");
//        for (i = 0; i < 10; i++)
//        {
//                printf("a[%d]=%d\n", i, a);
//        }
//        printf("\n");
//        return 0;
//}


//例子;将上面的形参的例子改为指针变量

//void inv(int *x, int n)//形参为指针变量
//{
//        int *i, *j, *p, temp, m = (n - 1) / 2;
//        i = x; j = x + n - 1; p = x + m;
//        for (; i < p; i++, j--)
//        {
//                temp = *i; *i = *j; *j = temp;
//        }
//        return ;
//}
//
//int main()
//{
//        int a = { 0,1,2,3,4,5,6,7,8,9 }, i,*p;
//        p = a;
//        printf("The original array is:\n");
//        for (i = 0; i < 10; i++)
//        {
//                printf("a[%d]=%d\n", i, a);
//        }
//        inv(a, 10);
//        printf("The array has been inverted:\n");
//        for (i = 0; i < 10; i++)
//        {
//                printf("a[%d]=%d\n", i, a);
//        }
//        printf("\n");
//        return 0;
//
//}

//例子:从10中找出其中的最大值和最小值

//int max, min;//设置的是全局变量
//void max_min_value(int array[], int n)
//{
//        int *p, *array_end;
//        array_end = array +n;
//        max = min = *array;
//        for (p = array + 1; p < array_end; p++)
//        {
//                if (*p > max)        max = *p;
//                else if (*p < min)        min = *p;
//        }
//        return;
//}
//int main()
//{
//        int number, i;
//        printf("please enter 10 number:\n");
//        for (i = 0; i < 10; i++)
//        {
//                scanf_s("%d", &number);
//        }
//        max_min_value(number, 10);
//        printf("max=%d,min=%d\n", max, min);
//
//        return 0;
//}

//1.由于max和min是全局变量可以在函数里面直接使用
//2.函数max_min_value的语句中:max=min=*array;array是数组名,他接收从实参传来的数组number的首地址
//*array相当于*(&array)。上述语句max=min=array是等价的

//上述例子可以把形参array改为指针变量的类型。实参也可以不用数组名,而是用指针变量传递地址。

//程序可以改为一下
//int max, min;//全局变量
//void max_min_value(int *array ,int n)
//{
//        int *p, *array_end;
//        array_end = array + n;
//        max = min = *array;
//        for (p = array + 1; p < array_end; p++)
//        {
//                if (*p > max)        max = *p;
//                else if (*p < min)        min = *p;
//        }
//        return ;
//}
//
//int main()
//{
//        int number, i,*p;
//        p = number;
//        printf("please enter 10 number:\n");
//        for (i = 0; i < 10; i++,p++)
//        {
//                scanf_s("%d", p);
//        }
//        p = number;//一定要p回到数组的首地址
//        max_min_value(p, 10);
//        printf("max=%d,min=%d\n", max, min);
//        return 0;
//
//}

//例子用实参指针变量改写将n个整数按相反顺序存放
//void inv(int *x, int n)
//{
//        int temp, *first, *end, mid,*m;
//                first = x;
//                end = x + n - 1;
//                mid = (n - 1) / 2;
//                m = first + mid;
//                for (; first <=m; first++,end--)
//                {
//                        temp = *first; *first = *end; *end = temp;
//                }
//                return;
//}
//
//int main()
//{
//        int array = { 0,1,2,3,4,5,6,7,8,9 }, i, *p;
//        p = array;
//        printf("The original array:\n");
//        for (i = 0; i < 10; i++,p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        inv(array, 10);
//        printf("The array has been inverted:\n");
//        p = array;
//        for (i = 0; i < 10; i++, p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        return 0;
//
//}
//main函数中指针变量p是有确定值的,即如果用指针作实参,必须使指针变量有确定的值

//例子:用选择法对10个整数进行由大到小进行排序
//从数组中的第一个开始一次和数组后面的每个数进行比较

//void sort(int x[], int n)
//{
//        int i, j, k, t;
//        for (i = 0; i < n-1; i++)
//        {
//                k = i;
//                for (j = i + 1; j < n; j++)
//                {
//                        if (x > x) x = x;//这行有一个错误
//                       
//                }
//                if (k!=i)
//                {
//                        t = x;
//                        x = x;
//                        x = t;
//                }
//        }
//        return;
//}
//
//int main()
//{
//        int *p, i, a = { 0,1,2,3,4,5,6,7,8,9 };
//        printf("The original array is:\n");
//        p = a;
//        for (i = 0; i < 10; i++,p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        sort(a, 10);
//        p = a;
//        printf("The sort array is:\n");
//        for (i = 0; i < 10; i++, p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        return 0;
//}

//说明:函数sort用数组名作为形参,也可改为用指针变量,这时候,函数的首部可以改为:sort(int *x,int n)其他可以一律不改

//void sort(int *x, int n);
//
//int main()
//{
//        int i, *p, a = { 0,1,2,3,4,5,6,7,8,9 };
//        printf("The original array is :\n");
//        p = a;
//        for (i = 0; i < 10; i++,p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        sort(a, 10);
//        printf("The has sort array is:\n");
//        p = a;
//        for (i = 0; i < 10; i++, p++)
//        {
//                printf("a[%d]=%d\n", i, *p);
//        }
//        return 0;
//}
//
//void sort(int *x, int n)
//{
//        int i, j, k, t;
//        for (i = 0; i < n - 1; i++)
//        {
//                k = i;
//                for (j = i + 1; j < n; j++)
//                {
//                        if (x > x) k = j;//(编写时的错误)数组下标交换,不是数组内容交换
//                }
//                if (k != i)
//                {
//                        t = x;
//                        x = x;
//                        x = t;
//                }
//        }
//        return;
//}

苏紫方璇 发表于 2021-11-7 12:03

帮楼主重排一下
#include<stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS

//数组名作函数的参数:
//知道了指针变量之后,其实数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,
////形参得到该地址后也指向同一数组。同样的,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用
//
float aver(float *pa);

int main()
{
       float sco, av, *sp;
       int i;
       sp = sco;
       printf("\ninput 5 scores:\n");
       for (i = 0; i < 5; i++)
       {
               scanf_s("%f", &sco);
               av = aver(sp);
       }
       printf("averge score is %5.2f\n", av);
       return 0;

}
float aver(float *pa)
{
       int i;
       float av, s = 0;
       for (i = 0; i < 5; i++)
       {
               s = s + *pa++;
       }
       av = s / 5;
       return av;
}

//例子:将数组a中的n个整数按相反顺序存放

void inv(int x[], int n)
{
       int temp, i, j, m = (n-1)/2;
       for (i = 0; i < m; i++)
       {
               j = n - 1 - i;
               temp = x; x = x; x = temp;
       }
       return ;
}

int main()
{
       int i, a = { 0,1,2,3,4,5,6,7,8,9 };
       printf("The original array is:\n");
       for (i = 0; i < 10; i++)
       {
               printf("a[%d]=%d\n", i, a);
       }
       inv(a, 10);
       printf("The array has been inverted:\n");
       for (i = 0; i < 10; i++)
       {
               printf("a[%d]=%d\n", i, a);
       }
       printf("\n");
       return 0;
}


//例子;将上面的形参的例子改为指针变量

void inv(int *x, int n)//形参为指针变量
{
       int *i, *j, *p, temp, m = (n - 1) / 2;
       i = x; j = x + n - 1; p = x + m;
       for (; i < p; i++, j--)
       {
               temp = *i; *i = *j; *j = temp;
       }
       return ;
}

int main()
{
       int a = { 0,1,2,3,4,5,6,7,8,9 }, i,*p;
       p = a;
       printf("The original array is:\n");
       for (i = 0; i < 10; i++)
       {
               printf("a[%d]=%d\n", i, a);
       }
       inv(a, 10);
       printf("The array has been inverted:\n");
       for (i = 0; i < 10; i++)
       {
               printf("a[%d]=%d\n", i, a);
       }
       printf("\n");
       return 0;

}

//例子:从10中找出其中的最大值和最小值

int max, min;//设置的是全局变量
void max_min_value(int array[], int n)
{
       int *p, *array_end;
       array_end = array +n;
       max = min = *array;
       for (p = array + 1; p < array_end; p++)
       {
               if (*p > max)      max = *p;
               else if (*p < min)      min = *p;
       }
       return;
}
int main()
{
       int number, i;
       printf("please enter 10 number:\n");
       for (i = 0; i < 10; i++)
       {
               scanf_s("%d", &number);
       }
       max_min_value(number, 10);
       printf("max=%d,min=%d\n", max, min);

       return 0;
}

//1.由于max和min是全局变量可以在函数里面直接使用
//2.函数max_min_value的语句中:max=min=*array;array是数组名,他接收从实参传来的数组number的首地址
//*array相当于*(&array)。上述语句max=min=array是等价的

//上述例子可以把形参array改为指针变量的类型。实参也可以不用数组名,而是用指针变量传递地址。

//程序可以改为一下
int max, min;//全局变量
void max_min_value(int *array ,int n)
{
       int *p, *array_end;
       array_end = array + n;
       max = min = *array;
       for (p = array + 1; p < array_end; p++)
       {
               if (*p > max)      max = *p;
               else if (*p < min)      min = *p;
       }
       return ;
}

int main()
{
       int number, i,*p;
       p = number;
       printf("please enter 10 number:\n");
       for (i = 0; i < 10; i++,p++)
       {
               scanf_s("%d", p);
       }
       p = number;//一定要p回到数组的首地址
       max_min_value(p, 10);
       printf("max=%d,min=%d\n", max, min);
       return 0;

}

//例子用实参指针变量改写将n个整数按相反顺序存放
void inv(int *x, int n)
{
       int temp, *first, *end, mid,*m;
               first = x;
               end = x + n - 1;
               mid = (n - 1) / 2;
               m = first + mid;
               for (; first <=m; first++,end--)
               {
                     temp = *first; *first = *end; *end = temp;
               }
               return;
}

int main()
{
       int array = { 0,1,2,3,4,5,6,7,8,9 }, i, *p;
       p = array;
       printf("The original array:\n");
       for (i = 0; i < 10; i++,p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       inv(array, 10);
       printf("The array has been inverted:\n");
       p = array;
       for (i = 0; i < 10; i++, p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       return 0;

}
//main函数中指针变量p是有确定值的,即如果用指针作实参,必须使指针变量有确定的值

//例子:用选择法对10个整数进行由大到小进行排序
//从数组中的第一个开始一次和数组后面的每个数进行比较

void sort(int x[], int n)
{
       int i, j, k, t;
       for (i = 0; i < n-1; i++)
       {
               k = i;
               for (j = i + 1; j < n; j++)
               {
                     if (x > x) x = x;//这行有一个错误
                     
               }
               if (k!=i)
               {
                     t = x;
                     x = x;
                     x = t;
               }
       }
       return;
}

int main()
{
       int *p, i, a = { 0,1,2,3,4,5,6,7,8,9 };
       printf("The original array is:\n");
       p = a;
       for (i = 0; i < 10; i++,p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       sort(a, 10);
       p = a;
       printf("The sort array is:\n");
       for (i = 0; i < 10; i++, p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       return 0;
}

//说明:函数sort用数组名作为形参,也可改为用指针变量,这时候,函数的首部可以改为:sort(int *x,int n)其他可以一律不改

void sort(int *x, int n);

int main()
{
       int i, *p, a = { 0,1,2,3,4,5,6,7,8,9 };
       printf("The original array is :\n");
       p = a;
       for (i = 0; i < 10; i++,p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       sort(a, 10);
       printf("The has sort array is:\n");
       p = a;
       for (i = 0; i < 10; i++, p++)
       {
               printf("a[%d]=%d\n", i, *p);
       }
       return 0;
}

void sort(int *x, int n)
{
       int i, j, k, t;
       for (i = 0; i < n - 1; i++)
       {
               k = i;
               for (j = i + 1; j < n; j++)
               {
                     if (x > x) k = j;//(编写时的错误)数组下标交换,不是数组内容交换
               }
               if (k != i)
               {
                     t = x;
                     x = x;
                     x = t;
               }
       }
       return;
}

梦回吾爱 发表于 2021-11-7 15:37

沙发,谢谢分享

sqhs008 发表于 2021-11-7 17:11

第二天就学这么深了

laiyuou 发表于 2021-11-8 11:12

苏紫方璇 发表于 2021-11-7 12:03
帮楼主重排一下
#include
#define _CRT_SECURE_NO_DEPRECATE


突然就干劲十足了;www

laiyuou 发表于 2021-11-8 11:15

sqhs008 发表于 2021-11-7 17:11
第二天就学这么深了

每天学一点嘛,不怕它深就怕自己不想学{:1_907:}
页: [1]
查看完整版本: 学习c语言的第二天:关于数组名作为函数参数的一些学习