面试题

来源:互联网 发布:类似知乎的软件有哪些 编辑:程序博客网 时间:2024/06/05 22:49

1c语言函数传递二维数组

c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:

方法一, 形参给出第二维的长度。

例如:

#include
void func(int n, char  str[ ][5] )
{
 int i;
 for(i = 0; i < n; i++)
  printf("\nstr[%d] = %s\n", i, str[i]);
}

void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 func(3, str);
}

方法二,形参声明为指向数组的指针。

例如:

#include
void func(int n, char  *str[5] )
{
 int i;
 for(i = 0; i < n; i++)
  printf("\nstr[%d] = %s\n", i, str[i]);
}

void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 func(3, str);
}

 方法三,形参声明为指针的指针。

例如:

#include
void func(int n, char **str)
{
 int i;
 for(i = 0; i < n; i++)
  printf("\nstr[%d] = %s\n", i, str[i]);
}
void main()
{
 char* p[3];
 char str[][5] = {"abc","def","ghi"};
 p[0] = &str[0][0];
 p[1] = str[1];
 p[2] = str[2];
    func(3, p);
}

注:

如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢?

首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码:

int data[3][4] = { {1, 2, 3, 4}, {5, 5, 7, 8}, {9, 10, 11, 12} }  

int total = sum(data, 3);  

那么sum函数的原型应该如何声明呢?为什么将行数3作为参数,而不将列数4作为参数呢?

我们可以这样理解:data 是一个数组名,该数组有3个元素。而这3个元素本身都是又4int 组成的数组。因此data 的类型是 指向由4int组成的数组的指针。

因此正确的 sum 原型如下:

int sum( int (*arr) [4], int size);  

//其中的括号是必不可少的,因为下面的声明将声明一个由四个指向int的指针组成的数组,而不是一个指向由4int组成的数组的指针。  

int *arr[4];   //声明了一个指针数组,这个数组包含4int指针变量  

int *arr)[4] //声明了一个指针变量,这个指针指向由4int组成的数组  

还有另外一种声明格式,含义与上述正确原型完全相同,但是可读性更强:

int sumint arr[][4], int size;  


上述2个原型都指出,arr是指针而不是数组。还需要注意的是:int arr [ ] [4]的含义就是: arr是指向由4int 构成的数组的指针。因此,指针类型指定了列数,也就是说:函数形参已经确定了实参数组的列数,这就是为什么没有将列数作为独立的函数参数进行传递的原因。

2、向一个数组中插入另一个数组的技巧

 

3、字符数组与指针在内存中的区别:

 


 

原创粉丝点击