这节的内容比较少也比较简单,主要是觉得用的很少,所以单独提出来加深印象。主要涉及到函数如何返回一个数组的问题。还有关于内存的分配和扩展基础知识的复习。
一、如何使用指针从函数返回一个数组。
前几节,我们分析了怎么样把一个数组当参数传递给指针。本小节换个方向讨论数据的转化:从函数返回一个数组。严格的说,函数无法返回一个数组。但是可以让函数返回一个指向任何数据结构的指针,当然也可以是一个指向数组的指针,记住,声明必须在使用前。一个函数声明的例子如下:
int (*function())[20];
这里function是一个函数,它返回一个指针,该指针指向的是包含20个int类型元素的数组。
返回一数组的具体实现例子如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int (*function())[20]
{
int i=0;
int (*p)[20];//声明一个指向20个元素的指针;
p=(int(*)[20])calloc(20,sizeof(int));
//或者p=(int (*)[20])malloc(sizeof(int)*20);
if(!p)//内存不够;
{
cout<<"the memory is not enough!"<<endl;
return NULL;
}
for(i=0;i<20;i++)
(*p)[i]=i+5;
return p;
}
int main()
{
int (*result)[20];
result=function();
if(result)
{
cout<<(*result)[3]<<endl;//这样访问结果,应该输出8。
free(result);
}
system("pause");
return 0;
}
运行结果如下:
struct pp
{
int arr[20];
}x,y;
struct pp function() //结构体类型,返回一个结构体对象;
{
return y;
}
x=y;
x=functoin();
如果要访问一个元素:可以用下面的方法:
x.arr[10]=100;
注意:
千万不要返回一个指向函数的局部变量的指针。以前在
这里有详细的讲解!
函数可以返回的情况有:
(1)返回一个字符串常量;
(2)返回一个静态变量;
(3)返回一个全局变量;
(4)返回一个堆空间地址;
(5)最常用的就是(4)程序员自己申请一个堆区空间保存要返回的变量,然后返回。
二、使用指针创建和使用动态数组
在很多情况下,我们并不知道数组的长度,而是使用动态数组。绝大多数的语言都支持在运行时设置数组的长度。他们允许程序员计算需要处理的数据的个数,然后申请刚好大小的数组能容纳这些数据。
数组是静态的,数组的长度在编译期间已经确定不变。在这个领域,C语言支持很弱。你甚至不能用下面的形式:
const int number=10;
int array[number];//编译出错,期待一个整形常量表达式。
但是这样的语句在C++中是合法的。
1、现在我们来看一下如何实现动态数组,比较简单!
它的基本思路就是使用malloc()库函数来得到一大块内存的指针。然后,像引用数组一样引用这块内存,其机理就是一个数组下标访问可以改写一个指针加上偏移量。
具体代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int number;
int *arr=NULL;
int i=0;
printf("please input the number of your array:\n");
scanf("%d",&number);//根据具体的个数分配动态空间。
arr=(int *)malloc(sizeof(int)*number);
for(i=0;i<number;i++)
arr[i]=i+5;
for(i=0;i<number;i++)
printf("%d-",arr[i]);
printf("\n");
system("pause");
return 0;
}
输入5,运行结果:
动态数组对于避免预定义的限制也是非常有用的。这样既可以避免空间的浪费,也可以避免内存不够用的尴尬。方便了程序员,但是一定要记住释放申请的内存,,不然会造成内存的泄漏(leak memeory)。
2、内存的扩展realloc()函数,比较简单,不要是为了练手,可能有些冗余,复习的时候可以跳过。
代码实现如下:
#include <stdio.h>
#include <stdlib.h>
int current_element=0;
int total_element=3;
char *arr=NULL;
void add_element(char c)
{
if(current_element==total_element-1)
{
total_element*=2;
arr=(char *)realloc(arr,total_element);
if(NULL==arr)
{
printf("the memory is not enough!\n");
return ;
}
else
{
printf("realloc successfully!\n");
}
}
arr[current_element++]=c;
}
int main()
{
int number;
int i=0;
char *add="ky";
char array[10]="abcdefghi";
arr=(char *)malloc(total_element);
while(current_element < total_element-1)
arr[current_element++]=array[i++];
add_element(add[0]);
add_element(add[1]);
printf("\n");
i=0;
while(i<current_element)
printf("%c-",arr[i++]);
printf("\n");
free(arr);
system("pause");
return 0;
}
运行结果:
在笔记(八)里面用到了一个calloc(n,sizeof(value))函数,它和malloc(size)类似,但是它有两个参数,一个是变量的大小,一个是变量的个数,返回值是n个变量value的大小空间的首地址。主要适合用于数组指针的申请内存空间。
例如:
int (*p)[5];//p指向的是一个有5个int元素的内存空间;
p=(int (*)[5])calloc(5,sizeof(int));
................................