#include<stdio.h>
#include<stdlib.h>
int* t(int b[3])
{
b[0]=b[0]+b[2];
b[2]=b[0]-b[2];
b[0]=b[0]-b[2];
return b;
}
int main()
{
int a[3]={1,2,3};
a=t(a);
for(int i=0;i<3;i++)
printf("%d ",a[i]);
}
修改如下,不需要返回值,传递数组可以直接修改
#include<stdio.h>
#include<stdlib.h>
void t(int b[3])
{
b[0]=b[0]+b[2];
b[2]=b[0]-b[2];
b[0]=b[0]-b[2];
}
int main()
{
int a[3]={1,2,3};
t(a);
for(int i=0;i<3;i++)
printf("%d ",a[i]);
}
把第14行的a=t(a)改为 int * c = t(a),因为数组名a是指针常量,是不可以赋值的,用一个int指针接收函数t的返回值就可以了。
修改如下:
参考链接:
#include<stdio.h>
#include<stdlib.h>
int* t(int b[3])
{
b[0]=b[0]+b[2];
b[2]=b[0]-b[2];
b[0]=b[0]-b[2];
return b;
}
int main()
{
int a[3]={1,2,3};
// 使用数组指针存储函数t的返回值
// int指针c里的地址其实就是数组a的起始地址
int * c=t(a);
for(int i=0;i<3;i++)
printf("%d ",a[i]); // 这里a[i]也可以改为c[i],因为指针c和数组名a是同一个地址
}
#include<stdio.h>
#include<stdlib.h>
void t(int b[3])
{
b[0]=b[0]+b[2];
b[2]=b[0]-b[2];
b[0]=b[0]-b[2];
return;
}
int main()
{
int a[3]={1,2,3};
t(a);
for(int i=0;i<3;i++)
printf("%d ",a[i]);
}
数组和指针还是不一样的,你可以不用返回值,直接就用a就可以了 ,或者用另外一个指针接受返回值,如int *b=t(a);
a是数组首地址,和指针不一样
主要思想:利用sizeof计算出数组的元素,因为数组下标从1开始,需要将算出来的元素个数减1.因为传入十个元素递归方法不能直接比较,所以需要先转化为两个元素来比较,一直递归到第一个元素的下标,返回给k,然后k和f(arr[1])比较,哪个大就返回哪个,以此类推
代码演示:
#include<stdio.h>
int Array(int arr[], int sz)
{
int k = 0;
if (sz > 0)
{
k = Array(arr, sz - 1);//将它从大问题化为小问题,递归到只有两个数进行比较
if (k > arr[sz])
{
return k;
}
else
return arr[sz];
}
else
{
return arr[0];
}
}
int main()
{
int arr[] = { 9,2,4,5,0,1,6,7,8 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = Array(arr, sz - 1);//下标从0开始,所以减1
printf("%d", ret);
return 0;
}
答案:
在使用数组作为函数参数和返回值时,我们需要注意数组名在本质上是一个地址,表示的是数组第一个元素的地址。
元素调换的问题可能是因为数组参数传递时,传递的是数组名(即数组全局地址)的值,而不是数组元素的值。因此,我们需要确保该函数正确获得了数组元素的值。
以下是一些可能要考虑的解决方案:
1.如果要在函数中改变数组的值,需要使用指针的形式输入数组的地址。例如,如果我们使用一个数组进行元素调换,可以使用以下代码:
void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
void swapArray(int *arr,int len){
int i=0;
for(i=0;i<len/2;i++){
swap(arr+i,arr+len-1-i);
}
}
2.以数组名作为形式参数,就像这样:int arrayExp(int array[][],int n1,int n2),注意第二个括号不是指定数组的维数(撰写工具此处已修改),但在此处实现中无法改变这些数组的值。
#include<stdio.h>
void swapArray(int arr[],int len){
int i=0;
for(i=0;i<len/2;i++){
int temp=arr[i];
arr[i]=arr[len-1-i];
arr[len-1-i]=temp;
}
}
void printArray(int *arr,int len){
int i=0;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[6]={6,7,8,9,10,11};
swapArray(arr1,5);
swapArray(arr2,6);
printArray(arr1,5);//输出:5 4 3 2 1
printArray(arr2,6);//输出:11 10 9 8 7 6
return 0;
}
此处的swapArray函数将数组转换为指向第一个元素的指针来调用,并且只能使用嵌套的循环,因为这里不能将该数组作为指针类型传递。
3.使用指针作为数组的返回值。例如,我们可以像这样定义一个反转数组的函数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *reverse(int *arr,int length){
int i=0;
int *p=(int*)malloc(length*sizeof(int));
//动态创建长度为length的整型数组
//使用指针指向该数组的首地址
for(i=0;i<length;i++){
*(p+length-1-i)=arr[i];
}
return p;
}
void printArray(int *arr,int len){
int i=0;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
int main() {
srand((unsigned int)time(NULL));
int arr[10];
int i=0;
for(i=0;i<10;i++){
arr[i]=rand()%100;
}
printArray(arr,10);
int *new_arr=reverse(arr,10);//调用reverse函数
printArray(new_arr,10);//输出反转的数组
free(new_arr);//释放新数组内存
return 0;
}
在此处,我们这样发送一个指向数组的指针。reverse函数使用动态分配内存来存储反向数组并返回指向该数组的指针。可以在主函中调用free(new_arr)以释放创建指向数组的动态指针new_arr的空间。
4.可以将要传递的数组作为形式参数(void swapArray(int arr[5])),也可以让程序员在函数调用时指定数组的长度(void swapArray(int arr[],int len)),这里有两种语法,但它们还是与指针有关。C语言标准中没有支持将数组视为一个整体而设计的机制,使用C++可能可以处理更多的问题。
综上,以上提供了几种在C语言中使用数组作为函数参数和返回值的方法。在使用这些方法时,我们必须理解数组名本质上是一个地址,这是C语言的基本特性之一,并需要根据我们的需要正确传递参数和返回值的格式以及正确的类型和指针。