函数传递的例子
函数传递/*No.1*/一维数组参数传递 void convert_data(int *,int); //void convert_data(int *pdata,int n); //void convert_data(int pdata[ ],int n); ### 函数传递的相关知识点 #### 一、一维数组参数传递 在C语言中,当我们将一维数组作为参数传递给函数时,实际上传递的是数组的首地址(即指向数组第一个元素的指针)。这种机制使得函数能够直接访问并修改数组中的元素。 **示例代码分析:** ```c void convert_data(int *pdata, int n) { int i; for (i = 0; i < n; i++) { printf("%d", pdata[i]); // 或者 printf("%d", *(pdata + i)); } } void main() { int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; convert_data(data, 10); // 传递数组data的首地址和元素个数 } ``` **解析:** - **函数定义** `void convert_data(int *pdata, int n)` 表明`convert_data`函数接受一个整型指针`pdata`和一个整型变量`n`作为参数。 - 在主函数`main`中,我们声明了一个包含10个整数的数组`data`,并通过`convert_data(data, 10)`调用该函数,将`data`的首地址和长度传入。 - 在`convert_data`函数内部,通过指针`pdata`遍历数组,并打印每个元素的值。 - 另外,`pdata[i]`与`*(pdata + i)`是等价的,都表示数组第`i`个元素的值。 #### 二、二维数组对应数组指针 当处理二维数组时,可以使用数组指针来简化操作。在C语言中,二维数组可以被视为指向一维数组的指针数组。因此,可以使用数组指针类型来传递二维数组给函数。 **示例代码分析:** ```c void convert_data(int (*pdata)[4], int n1, int n2) { int i, j; for (i = 0; i < n1; i++) { for (j = 0; j < n2; j++) { printf("%d", *(pdata[i] + j)); // 或者 printf("%d", pdata[i][j]); } printf("\n"); } } void main() { int data[3][4] = {{0, 1, 2, 4}, {5, 6, 7, 8}, {1, 5, 7, 8}}; convert_data(data, 3, 4); } ``` **解析:** - `void convert_data(int (*pdata)[4], int n1, int n2)` 定义了函数`convert_data`,其中`int (*pdata)[4]`是一个指向含有四个整型元素的一维数组的指针。 - `convert_data(data, 3, 4)` 调用了`convert_data`函数,并传入了`data`的首地址以及行数和列数。 - 在函数内部,使用双层循环遍历二维数组,通过`pdata[i][j]`或`*(pdata[i] + j)`获取每个元素的值并打印出来。 #### 三、直接用二维数组名传递参数 也可以直接使用二维数组的名字作为参数传递给函数,而无需显式地使用数组指针类型。 **示例代码分析:** ```c void convert_data(int pdata[][4], int n1, int n2) { int i, j; for (i = 0; i < n1; i++) { for (j = 0; j < n2; j++) { printf("%d", *(pdata[i] + j)); // 或者 printf("%d", pdata[i][j]); } printf("\n"); } } void main() { int data[3][4] = {{0, 1, 2, 4}, {5, 6, 7, 8}, {1, 5, 7, 8}}; convert_data(data, 3, 4); } ``` **解析:** - `void convert_data(int pdata[][4], int n1, int n2)` 定义了函数`convert_data`,其中`int pdata[][4]`表示一个未知行数但每行有四个元素的二维数组。 - 其他部分与上一节相同。 #### 四、用数组指针处理多个字符串 可以通过数组指针来处理多个字符串,这种方式在处理字符串数组时非常方便。 **示例代码分析:** ```c void convert_data(char (*pdata)[80], int n) { int i; for (i = 0; i < n; i++) { puts(*(pdata + i)); } } void main() { char data[3][80] = {"abc", "def", "hjg"}; convert_data(data, 3); } ``` **解析:** - `void convert_data(char (*pdata)[80], int n)` 定义了函数`convert_data`,其中`char (*pdata)[80]`是一个指向含有80个字符的字符串数组的指针。 - `convert_data(data, 3)` 调用了`convert_data`函数,并传入了`data`的首地址和字符串的数量。 - 在函数内部,通过循环遍历每个字符串,并使用`puts`函数打印出来。 #### 五、用指针数组或多级指针处理多个字符串 可以通过指针数组或多级指针来处理多个字符串,这种方式适用于更灵活的字符串处理场景。 **示例代码分析:** ```c void convert_data(char *pdata[], int n) { int i; for (i = 0; i < n; i++) { puts(pdata[i]); } } void main() { char *data[] = {"abc", "def", "hjg"}; convert_data(data, 3); } ``` **解析:** - `void convert_data(char *pdata[], int n)` 定义了函数`convert_data`,其中`char *pdata[]`是一个指向字符串的指针数组。 - `convert_data(data, 3)` 调用了`convert_data`函数,并传入了`data`的首地址和字符串的数量。 - 在函数内部,通过循环遍历每个字符串,并使用`puts`函数打印出来。 #### 六、用一维指针处理二维数组数据 通过一维指针可以灵活地处理二维数组中的数据。 **示例代码分析:** ```c void convert_data(int *pdata, int n) { int i; for (i = 0; i < n; i++) { printf("%d", pdata[i]); } } void main() { int data[3][4] = {{0, 1, 2, 4}, {5, 6, 7, 8}, {1, 5, 7, 8}}; convert_data(*(data + 1), 4); } ``` **解析:** - `void convert_data(int *pdata, int n)` 定义了函数`convert_data`,其中`int *pdata`是一个指向整型变量的指针。 - `convert_data(*(data + 1), 4)` 调用了`convert_data`函数,并传入了第二行的数据和列数。 - 在函数内部,通过循环遍历指针所指向的数据,并打印出每个元素的值。