暑假工作日志——再谈函数用指针返回数组

数组可以作为函数的输入参数,这个很简单,例如:void fun(int a[],int i);

上述函数原型中第一个输入参数就是一个int a[],是一个整型的数组。那么一个函数能不能返回一个数组,怎么返回一个数组呢?

比如,我们在一个函数InsertData里面要向一个输入的空数组a[]中插入变量,然后将其返回,怎么办呢?

我们知道数组在内存中也是有地址的,数组也是有指针的。我们可否不直接返回数组,而间接地返回指向该数组的指针呢?

假如一个数组是int型的数组,指向他的指针就是一个指向int型的指针常量,该指针就是数组的名称,其是指向数组中的第一个元素的。

那么要返回一个int型的数组我们就只需返回一个指向int型变量的指针即可。例如,我们要通过InsertData返回一个整型数组,我们的函数原型就可以像这样来写:

int *InsertData(int a[]);

我们在VC6.0的环境下进行了实验,代码如下:

#include<stdio.h>

int *InsertData(int a[]);

int num[10];

void main(void)
{
	unsigned char i=0;
    int *b=InsertData(num);
	for(i=0;i<10;i++)
	{
	printf("%d
",b[i]);
	}

}

int *InsertData(int a[])
{
	unsigned char i=0;
	for(i=0;i<10;i++)
	{
	a[i]=i*10;
	}
    return a;
}

从上述代码中我们可以看到我们输入的是一个整型数组,输出的是一个指向整型变量的指针,从函数体中“return a;”我们可以看出来,该指针是指向我们需要输出函数的首地址的,数组名就是一个指向数组首地址的指针。如此以来,我们就将带输出的数组的首地址返回了出来。然后我们在main函数中再定义了一个指向整型变量的指针b用于接收函数InsertData输出的数组的首地址。在int *b=InsertData(num);运行结束之后,b中存放的就是数组的首地址。然后我们就可以通过b来访问数组元素了。如:printf("%d ",b[i]);这是一种访问方式,将b就看成一个数组。//当然为什么可以这样写,我还不知道,只知道这样写结果是正确的

另外我们还可以这样写printf("%d ",*(b+i));这样写我们就好理解了,因为b里面存放的是输出数组的首地址,指向的是数组中的第一个元素,即*b就是数组中的第一个元素,而*(b+i) (0<=i<=9)则指向的是数组中的第i个元素。这样我们也可以访问数组中的所有元素。

最后我们还补充一点:我们之前说过,数组名就是指向数组的指针,那么指向数组的指针变量和数组名有没有什么区别呢?

eg.:int a[10],*b;

b=a;

void main()

{

unsigned char i=0;

for(i=0;i<10;i++)

{

*b++=i;

}

}

上述代码的意思很容易理解,我们定义一个整型的数组,然后定义一个指向整型变量的指针变量,然后第二行代码中我们将数组的首地址赋给指针b。接下来在主函数中我们通过一个for循环来给数组元素赋值。

那么不禁要问,我直接这样写可不可以:*a++=i;?

结果是不行,为什么呢?这就是指向数组的指针变量和数组名之间的区别。我们说过,数组名是一个指针,指向数组首地址,也是数组的第一个元素。然而当一个数组定义后,数组名都是指向该地址,而不能被修改,也就是说数组名是一个指针常量,而前者是一个指针变量,

类似于数组名是 int *(const a),而前者是int *b;

这样就不难理解为什么不能写*a++=i了,因为常量是不允许写入或者修改的。

另外在这里我还解释一个疑惑,到底*b++的时候是将b+1呢?还是该怎么理解?

查阅相关资料,我们得知:假如有一个指针b,那么指针的每一个+1或者-1,并非指针值的+1或者-1,而是加上或者减去该指针所指向的那个变量数据类型的长度,即他所指向的存储单元所占用的字节数。亦即b++,b就会指向下一个元素, b++(或++b)的结果等同于:b = b+sizeof(int),而 b--(或--b)的结果是 b = b-sizeof(int)

最后我还说明一点,这是关于我们在本篇最前面说的数组作为函数输入参数的问题,同样跟输出一个数组一样,我们除了直接输入一个数组,也可以输入指向该数组的指针。那么函数InsertData原型也可以这样写:

int *InsertData(int *a);

原文地址:https://www.cnblogs.com/wan0807/p/4791841.html