在函数定义中形参使用指针数组char *s[]来表示形参,即char* change(char *s[])。而在函数调用中使用二维数组,即char poem[4][20]传入实参是否可行,如果不可行,为什么不行??
时间: 2023-12-24 14:06:04 浏览: 80
在函数定义中使用指针数组 char *s[] 来表示形参,是因为指针数组本身就是一个指向指针的指针,因此可以通过指针数组来访问原始的指针,进而访问数组中的数据。
而在函数调用中使用二维数组 char poem[4][20] 传入实参,实际上是将一个二维数组的首地址传递给了指针数组。由于二维数组的内存布局和指针数组是不同的,因此编译器可能会对二者进行不同的处理。因此,如果在函数定义中使用指针数组作为形参,那么最好也使用指针数组作为实参,这样可以确保程序的正确性。
也就是说,如果要将一个二维数组传递给一个使用指针数组作为形参的函数,需要先将二维数组转换为指针数组,然后再将指针数组作为实参传递给函数。例如,可以定义一个临时的指针数组,将二维数组的每一行的首地址赋值给指针数组的对应元素,然后将指针数组作为实参传递给函数。
修改后的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* change(char *s[], int n);
int main(void)
{
char poem[4][20];
int n, i;
for (i = 0; i < 4; i++)
{
fgets(poem[i], sizeof(poem[i]), stdin);
}
char* ptr[4];
for (i = 0; i < 4; i++)
{
ptr[i] = poem[i];
}
char* result = change(ptr, 4);
for (i = 0; result[i] != '\0'; i++)
{
printf("%c", result[i]);
}
return 0;
}
char* change(char *s[], int n)
{
char* a = NULL;
a = (char*)malloc(sizeof(char) * 10);
int i;
for (i = 0; i < n; i++)
{
a[2 * i] = s[i][0];
a[2 * i + 1] = s[i][1];
}
a[2 * i] = '\0';
return a;
}
```
修改后的代码中,先定义一个指针数组 ptr,将二维数组 poem 的每一行的首地址赋值给 ptr 的对应元素。然后将 ptr 作为实参传递给函数 change(),确保程序的正确性。
阅读全文