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

🏷️ nowgoal365live score 📅 2025-07-10 10:08:46 👤 admin 👀 1503 ⭐ 976
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

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;

}

相关推荐 ✨

365bet苹果app 倒车雷达声音小怎么办

倒车雷达声音小怎么办

📅 07-06 👀 8572
约彩365官方下载安装 如何关闭电池用量记录

如何关闭电池用量记录

📅 06-28 👀 840
nowgoal365live score wowicc巫妖王怎么走

wowicc巫妖王怎么走

📅 07-02 👀 5050
nowgoal365live score 芊的意思

芊的意思

📅 06-29 👀 5927
365bet苹果app 腾达路由器管理地址

腾达路由器管理地址

📅 07-01 👀 5733