以函数返回值之外的方式来返回值
如果将指针作为参数传递给函数,此后在函数内部对指针指向的对象填充内容,就可以从函数返回多个值。
例子:
#include<stdio.h>
void func(int *a, double *b) {
*a = 3;
*b = 5.2;
}
int main(void) {
int a;
double b;
func(&a, &b);
printf("a = %d\nb = %f\n", a, b);
return 0;
}
将数作为函数参数传递
想要将类型T的数组作为参数进行传递,可以考虑传递“指向T的指针”。可是,作为被调用方是不知道数组的元素的个数的,所以在必要的情况下,需要使用其他方式进行参数传递。
例子:
#include<stdio.h>
void func(int *array, int size) {
int i;
for (int i = 0; i < size; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
}
int main(void) {
int array[] = {1,2,3,4,5,6};
func(array, sizeof(array)/sizeof(int));
return 0;
}
可变长数组
在需要获得类型T的可变长数组时,可以使用malloc()来东台的给“指向T的指针”分配内存区域。
但是此时需要程序员自己对数组的元素个数进行管理。
#include<stdio.h>
#include<stdlib.h>
int main(void) {
char buf[256];
int size;
int *variable_array;
int i;
printf("input array size>");
fgets(buf, 256, stdin);
sscanf(buf, "%d", &size);
variable_array = malloc(sizeof(int) * size);
for (i = 0; i < size; i++) {
variable_array[i] = i;
}
return 0;
}
组合使用
可变长数组的数组
这数组指的是:数组本身的大小是不变的,数组中的元素的大小是可以变长的。
比如说:一周7天,每一天一个口号。
进行声明:char *slogan[7];
例子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void read_slogan(FILE *fp, char **slogan) {
char buf[1024];
int i;
for (i = 0;i < 7; i++) {
fgets(buf, 1024, fp);
/*删除换行字符*/
buf[strlen(buf) - 1] = '\0';
/*分配保存一个标语的内存空间*/
slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1));
/*赋值标语的内容*/
strcpy(slogan[i], buf);
}
}
int main(void) {
char *slogan[7];
int i;
read_slogan(stdin, slogan);
/*输出读取的标语*/
for (i = 0; i < 7; i++) {
printf("%s\n", slogan[i]);
}
return 0;
}
可变长数组的可变长数组
这数组指的是:数组本身的大小是可变的,数组中的元素的大小是可以变长的。
命令行参数
int main();
int main(int argc, char *argv[ ]);
数组的可变长数组
double (*polyline)[2]; //两个值构成一个点的坐标
/*npoints是构成多点折线的坐标的个数*/
ployline = malloc(sizeof(double[2]) * npoints);
或者这样写:
typedef double point[2];
point *polyline;
polyline = malloc(sizeof(point) * npoints);
纠结于“可变”之前,不妨考虑使用结构体。
不想写了,今天好累啊。