Bootstrap

C语言基础(10)数组作为函数参数传递

1.数组名作为函数参数传递:

  • 数组名作为函数参数传递时,会被视为指向数组首元素的指针。例如,如果传递一个int类型的数组arr给函数,实际上传递的是arr的首地址。
void fn1(int arr[]);
void fn2(int *arr);

        函数参数中的int arr[]int *arr表示相同的含义,都是一个指向int类型数据的指针

指针传参的形式可以实现在被调函数中修改主调函数中的内容。

数组元素可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。

数组名作为参数传递时,在被调函数使用sizeof函数去获得其占用大小时,形式为

int f1(int a[])
{
    s = sizeof(a);
}

sizeof函数实际上是读取数据的数据类型。

sizeof(a)的值为8,因为数组名传递参数时,传递给形参的数组的首地址,地址数据占用8个字节。

由于在被调函数中无法求得数组的占用大小,因此在数组作为函数参数传递时还需要传递数组的长度。

字符串数组在传参时可以不传递数组的长度,因为字符串的末尾有 '\0'字符。

2.二维数组作为函数传参

        二维数组在函数声明中,必须明确指定二维数组的列数。只有第一维可以忽略大小,其余维度必须指定。

void function(int arr[][10]);  // 10是列数,必须指定

当二维数组作为参数传递时,数组名会退化为指向数组第一行的指针。虽然整体仍然是二维数组

如果函数需要使用数组的行数或其他维度的信息,需要显式传递这些大小。

void function(int arr[][10], int rows);

        const char *a

这种形式既可以存储字符串常量,也可以存储一个指针。

使用const char *可以防止意外修改字符串内容

#include<stdio.h>
int sumOfTheArray(int a[],int len)
{
    int sum = 0;
    for(int i = 0 ; i < len ; ++i)
    {
        sum += a[i];
    }
    return sum;
}
int maxOfTheArray(int a[],int len)
{
    int max = a[0];
    for(int  i = 1 ; i < len; ++i)
    {
        max = a[i] > max ? a[i] : max;
    }
    return max;
}
void reverse(int a[] ,int len)
{
    for(int i = 0 ; i < len / 2 ;++i)
    {
        int t;
        t = a[i];
        a[i] = a[len - i - 1];
        a[len - i - 1] = t;
    }
}
void printArray(int a[], int len)
{
    for(int i = 0 ; i < len ; ++i)
    {
        printf("%d ",a[i]);
    }
    puts("");
}
void selection_sort(int a[],int len)
{
    for(int i = 0; i < len ; ++i)
    {
        for(int j = i + 1 ; j < len ; ++j)
        {
            if(a[i] > a[j])
            {
                int t ;
                t = a[i];
                a[i] = a[j];
                a[j] = t ;
            }
        }
    }
}
void bubble_sort(int a[],int len)
{
    for(int i = len -1; i > 0 ; --i)
    {
        for(int j = 0 ; j < i ; ++j)
        {
            if(a[j] > a[j + 1])
            {
                int t ;
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t ;
            }
        }
    }
}
void insertion_sort(int a[], int len)
{
    for(int i = 1 ; i < len ;++i )
    {
        int  t = a[i];
        int  j = i;
        while( j > 0 && a[ j - 1] > t)
        {
            a[j] = a[j - 1];
            --j;
        }
        a[j] = t;
    }
}
int binary_search(int n,int a[],int len)
{
    int begin = 0, end = len - 1,i,mid;
    for(i = begin ; i <= end; ++i)
    {
         mid = (begin + end) / 2;
        if(n > a[mid])
        {
            begin =  mid +1;
        }
        else if(n < a[mid])
        {
            end =  mid - 1;
        }
        else
        {
            return mid;
        }
    }
        return -1;
}
void Puts(char s[])
{
    int i = 0;
    while(s[i])
    {
        putchar(s[i]);
        ++i;
    }
    putchar('\n');
}
int Strlen(char s[])
{
    int i =0;
    while(s[i])
    {
        ++i;
    }
    return i;
}
void Strcpy(char dest[],char src[])
{
    int  i = 0;
    while(src[i])
    {
        dest[i] = src[i];
        ++i;
    }
    dest[i] = '\0';
}
void Strcat(char *dest, char *src)
{
    int i = 0 , j = 0 ;
    while(dest[i])
    {
        ++i;
    }
    while(src[j])
    {
        dest[i] = src[j];
            ++j;
            ++i;
    }
    dest[i] = '\0';
}
int Strcmp(char *s1,char *s2)
{
    int i = 0;
    while(s1[i] == s2[i] && s1[i] &&s2[i])
    {
        ++i;
    }
    return s1[i] - s2[i];
}
void PrintfArray2D(int a[][4],int rows)
{
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(int i = 0 ; i < rows; ++i)
    {
        for(int j = 0 ; j < cols ; ++j)
        {
            printf("%5d ",a[i][j]);

        }
        puts("");
    }
}
int maxOfTheArray2D(int a[][4],int rows)
{
    int max = a[0][0];
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(int i = 0 ; i < rows ; ++i)
    {
        for(int j = 0 ; j < cols ; ++j)
        {
            if(a[i][j] > max)
            {
                max = a[i][j];
            }
        }
    }
    return max;
}
int edgeSumOfTheArray(int a[][4],int rows)
{
    int sum = 0;
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(int i = 0 ; i < rows ; ++i)
    {
        for(int j = 0 ; j < cols ; ++j)
        {
            if(0 == i || 0 == j || rows - 1 == i || cols - 1 == j)
            {
                sum += a[i][j];
            }
        }
    }
    return sum;
}
void fn(int a[][4],int rows,int f)
{
    int cols = sizeof(a[0]) / sizeof(a[0][0]);
    for(int i = 0 ; i < rows ; ++i)
    {
        for(int j = 0 ; j < cols ; ++j)
        {
            a[i][j] *= f;
        }
    }
}
void PrintStrings(char s[][100],int rows)
{
    for(int i = 0 ; i < rows ; ++i)
    {
        Puts(s[i]);
    }
}
void ReverseStrings(char s[][100],int rows)
{
    for(int i = 0 ; i < rows / 2 ; ++i)
    {
            char t[100];
            Strcpy(t,s[i]);
            Strcpy(s[i],s[rows - i - 1]);
            Strcpy(s[rows - i - 1],t);
    }
}
void SortStrings(char s[][100],int rows)
{
    for(int i = 1 ; i < rows ; ++i)
    {
        char t[100];
        Strcpy(t,s[i]);
        int j = i;
        while( j > 0 && Strcmp(s[j - 1],t) > 0)
        {
            Strcpy(s[j],s[j - 1]);
            --j;
        }
        Strcpy(s[j],t);
    }
}
int  binaryFindStrings(char s[][100],int rows,char n[])
{   
    int begin = 0 ,end = rows - 1,mid;
    for(int i = 0 ; i < rows ; ++i)
    {
        while(begin <= end)
        {
            mid = (begin + end ) / 2 ;
            if(Strcmp(s[mid],n) > 0)
            {
                end = mid - 1;
            }
            else if(Strcmp(s[mid],n) < 0)
            {
                begin = mid + 1;
            }
            else
            {
                return mid; 
            }
        }
    }
    return -1;
}
int main(void)
{
   char a[][100] = {"Hello","World","China"};
   char n[100] = "China";
   int rows = sizeof (a) / sizeof (a[0]);
   SortStrings(a,rows);
   PrintStrings(a,rows);
  int i =  binaryFindStrings(a,rows,n);
  if(i >= 0)
  {
  printf("Found: %s  index = %d\n",n,i);
  }
  else
  {
    printf("Not Found\n");
  }
    return 0;
}

;