能够直接在自定义函数中,写成指针类型返回值,直接返回呢?
#include <stdio.h>int* func(){int str[5]={1,2,3,4,5};return str;}int main(){int *b;b = func();for(int i=0; i<5; i++)printf("%d", b[i]);return 0;}
直接返回str数组名(注意不需要加&)。但事实上,运行结果并不正确,因为str本身是一个自定义函数中的局部变量,是一个数组有5个字节,它的生命周期当然也随着它所在的函数在一起,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,所以str数组这5个字节也将被回收,自然在main函数里再输出肯定已经不是原来的内容了。
方法一:
#include <stdio.h>int* func(){//char *str = "hello world!";int *str ;str = (int *)malloc(5*sizeof(int));for(int i=0; i<5; i++){*(str+i) = i;}return a;}int main(){int *b;//char *b;b = func();for(int i=0; i<5; i++)printf("%d\n", b[i]);free(b);//printf("%s\n", b);return 0;}
采用指针传递的方式。str虽然也是一个局部变量,但它是一个指针,只有四个字节,当它指向字符串时,字符串存在常量区, 而不属于fun函数里的部分,全程序可读,所以return后依旧存在;当指向非字符串时,采用malloc为str指向的空间分配内存,数据保存在堆区,注意在程序结束是要释放(free)掉内存。跟据自己需要在函数中加入形参。
方法二:
#include <stdio.h>int* func(){static int str[5] = {1,2,3,4,5} ;return str;}int main(){int *b;b = func();for(int i=0; i<5; i++)printf("%d\n", b[i]);return 0;}
采用static关键字。
方法三:
#include <stdio.h>%%%求100以内的素数%%%int func(int n, int a[]){int flag;int num=0;for(int i=2;i<=n;i++){flag = 1;for(int j=2; j<(int)i/2; j++){if(i%j==0){flag = 0;break;}}if(flag){a[num] = i;++num;}}return num;}int main(){int b[100];int n;n = func(100,b);for(int i=0; i<n; i++)printf("%-3d", b[i]);return 0;}
使用参数,将结果直接保存在传入参数中。
返回二位数组时的方法也是一样。
采用static的方式:
#include <stdio.h>int **func(){static int str[3][3] = {{1,2,3},{4,5,6},{7,8,9}} ;return str;}int main(){int **b;b = func();for(int i=0; i<3; i++){for(int j=0; j<3; j++){printf("%d\n", *((int *)b+3*i+j));}}return 0;}
采用malloc的方式:
#include<stdio.h>#define M 3#define N 2int main(){int **addOne(int a[M][N]);int a[M][N]={{1,1},{2,2},{3,3}};int i,j;printf("\n调用函数之后:\n");int **b = addOne((int **)a);for(i=0;i<M;i++)for(j=0;j<N;j++)printf("%d\t",*((int *)b+N*i+j));}int **addOne(int a[M][N]){int **b =(int **)malloc(M*sizeof(int *));//先申请M个指针型字节的空间for (int i=0;i<M;i++)b[i]=(int *)malloc(N*sizeof(int));//然后依次按一维申请int i,j;for(i=0;i<M;i++)for(j=0;j<N;j++)*((int *)b+N*i+j) = *((int *)a+N*i+j) + 1;//找地址,如同数据结构中矩阵找地址相同,首地址+(次数行数-1)*总列数+次数列数-1//i,j都是从0开始,可以不用减1return b;}