定义一个函数:
成都创新互联公司专注于汕尾网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供汕尾营销型网站建设,汕尾网站制作、汕尾网页设计、汕尾网站官网定制、微信小程序定制开发服务,打造汕尾网络公司原创品牌,更为您提供汕尾网站排名全网营销落地服务。
void f(void *d)
{
}
{ReadData,0,0,f}。
按你原来那样写,编译之后,这样报错:
[root@localhost test]# gcc 6.c
6.c:20: error: initializer element is not constant
6.c:20: error: (near initialization for ‘KeyboardTab[0].CurrentOperate’)
6.c:21: error: initializer element is not constant
6.c:21: error: (near initialization for ‘KeyboardTab[1].CurrentOperate’)
6.c:22: error: initializer element is not constant
6.c:22: error: (near initialization for ‘KeyboardTab[2].CurrentOperate’)
6.c:23: error: initializer element is not constant
6.c:23: error: (near initialization for ‘KeyboardTab[3].CurrentOperate’)
6.c:24: error: initializer element is not constant
6.c:24: error: (near initialization for ‘KeyboardTab[4].CurrentOperate’)
把源代码修改成这样:
KeyTabStruct KeyboardTab[43] =
{
{0 ,0 ,0 ,1 ,0 ,Menu0},
{1 ,1 ,1 ,2 ,42,Menu1},
{2 ,2 ,2 ,3 ,42,Menu2},
............
{41,41,41,42,40,Menu41},
{42,42,42,0 ,0 ,Menu42}
};
其余的不变,之后编译,结果为
[root@localhost test]# gcc 6.c
6.c:20: warning: initialization from incompatible pointer type
6.c:21: warning: initialization from incompatible pointer type
6.c:22: warning: initialization from incompatible pointer type
6.c:23: warning: initialization from incompatible pointer type
6.c:24: warning: initialization from incompatible pointer type
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
再加上main函数即可。
原因:指针即地址,函数指针也不例外,调用函数指针的时候,用的是函数所在的地址,“”是取地址符。
结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内存。
举例:编写函数,输入5个学号(int),5个姓名(字符串),5个成绩数组(每组三个成绩)(int[3]),依次调用函数
#include stdio.h
#include stdlib.h
struct student //建立结构体,学号,姓名,3门课的分数
{
int num;
char name[10];
int score[3];
}Stu[5]; //初始化,一共5个学生的数据
void getScore(struct student * p) //函数:向结构体读取分数,一共三门课
{
int i, j;
for (i = 0; i 5; i++)
for (j = 0; j 3; j++)
scanf_s("%d", ((p+i)-score[j]));
}
void getNum(struct student * p) //函数:向结构体读取学号
{
int i;
for (i = 0; i 5;i++)
scanf_s("%d", (p + i)-num);
}
void getName(struct student * p) //函数:向结构体读取姓名
{
int i;
for (i = 0; i 5; i++)
scanf("%s", (p + i)-name);
}
int main()
{
int i, j, average[3] = { 0 }; //average数组储存每门课的平均分
getNum(Stu); //函数调用
getName(Stu);
getScore(Stu);
for (j = 0; j 3; j++)
{
for (i = 0; i 5; i++)
average[j] += Stu[i].score[j];
}
for (i = 0; i 5; i++)
{
printf("num = %d name = %s Score:", Stu[i].num, Stu[i].name); //依次打印学号 姓名
//printf("%d %d %d", Stu[0].score[0],Stu[0].score[1],Stu[0].score[2]);
for (j = 0; j 3; j++) //打印三门课的分数
printf(" %d", Stu[i].score[j]);
printf("\n");
}
printf("average:");
for (i = 0; i 3; i++)
printf("%f ", (float)average[i]/5); //打印三门课平均分
printf("\n");
system("pause");
return 0;
}
如:
scanf("%c%c%c",a,b,c);
输入为:
d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
struct student *list;
int count = ReadStudentInfo("假设这是文件名", list);
这个函数是这样被调用。
里面应该这样写
int ReadStudentInfo(const char* filename, struct student** pStudents)
{
*pStudents = (struct student*)malloc(sizeof(** pStudents) * n);//假设有n个学生
}
fun函数的第二个参数之所以用指针,就是为了能把函数里面对这个参数做的改动保存下来
而你如果把*s=a[p];改成s=a[p];效果相当于,改了s的值,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的,但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=a[p];这个操作本身没有问题