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;
}