C语言基本概念笔记《四》之指针与函数,结构体,共用体,枚举

48 篇文章 2 订阅
28 篇文章 0 订阅

一·函数

1.函数的返回值类型和return中表达式类型不一致时,以函数的类型为准。
2.函数的参数:
①形参在编译时不分配存储空间,无初值,只有在函数调用时为其临时分配空间,接受实参值,函数调用结束,内存就被释放,
②数组元素作为参数和普通变量一样
③数组名作为参数,传递的实际上是数组首地址。被调函数可以使用数组的元素值,而且可以改变实参数组元素的值
int fff(int a[] ,int n)//建议a[]中不要指定数组长度
ff(a,n);
但是二维数组可以不指定一位的大小,二维的必须指定:
int fff(int a[][4] ,int n)
ff(a,n);
3.引用传递
swap(int *a,int *b);
swap(&a,&b);
效果等同于:
swap(int &a,int &b);
swap(a,b);
4.函数申明:
函数遵循先定义后使用原则,所以使用前要申明,
以下两种情况可以不用申明:
①当者函数在使用前已定义,。
②当函数返回值类型为int或char 时,
5.函数的调用:
①嵌套调用:函数不可以嵌套定义,但可以嵌套调用。
即在函数体内不能再定义函数,但是在被调用的函数体内可以再调用其他函数。
②递归调用:在函数体内调用其本身。
6.内部函数,外部函数
①内部函数:本文件内部的函数不能被同一程序的其他源文件程序调用;
内部函数的格式:static int f(int a,int b) 不加static则默认为外部函数
②外部函数:外部函数调用格式:extern aa(a,b);
对于变量引用也一样:
文件一:int x,y;
文件二:
extrn int x;
7.指针与函数
①.int * f();//定义函数f的返回值为 int型指针类型
②int (*f) ();//定义了一个指向函数的指针f,即函数指针变量f.例如:
int f(int x);
{
return 2*x;
}
main()
{
int (*p) ();
int a=9;
p=f;
printf(“%d”,(*p)(a));
}
8.指向函数的指针作为函数参数:
我们知道函数名就是函数的入口地址,由上面的例子我们可以知道,可以定义一个函数指针指向函数。那么我们可以用函数名作为实参,用函数指针作为形参。
int add1(int n)//求1~n中偶数的和
int add2 (int n)//求1~n中奇数的和
int result(int n, int (*p) () )
main()
{
int n=20;

if(flag==1) sum=result(n,add1);
else sum=result(n,add2);
}

二·结构体

1.结构体内的成员变量定义和变量一样,只不过不能赋初值。
2.结构体可以定义在函数内部(只在函数内部有效),也可以外部。
3.结构体的定义只是规定了这种数据类型的模型,但是在编译时不分配空间(解释了第一条)。
4.结构体变量的定义:
第一种:
//最常用,也是我觉得最严谨的一种定义方法(哈哈,我是个小白,不怕你们笑话)
struct student
{
};
struct student a,b;
第二种:
struct student
{
}a,b;
第三种:
struct
{
}a,b;
5.结构体变量的初始化:
struct student
{
char xue_hao[20];
char name[20];
int age;
char sex;
};
①在定义时,可以采用一次性赋初值(只能在定义时);
struct student a={“04151154”,”he_yuan”,20,’m’};
②可以只初始化一部分变量,但是必须从前往后初始化,未初始化的不能夹在中间,未初始化的会初始化为默认值
5.结构体成员的引用:
①int main()
{
struct student a;
strcpy(a.name,”he_yuan”);
a.sex=’m’;
····
}
②当两个结构体类型一样,可以整体赋值//注意不允许进行逻辑比较比如不允许:
a!=b
struct student a,b;
···
a=b;
6.结构体数组常用来表示有相同数据结构的一个群体。
定义格式;struct student a[30];
结构体数组元素的使用:a[0].age=20;
7.结构体变量 作为函数参数: 就把它当成一种数据类型比如int一样使用
8.用typedef给结构体区取别名:
直接举例:
typedef strcut student
{
}666,*s;
666 a;//相当于 strcut student a;
s p;//相当于 strcut student *p;

三·共用体

1.与结构体相似,用 union申明,存储空间与结构体不一样。
2.共用体初始化时只能用一个值初始化。
union s
{
};
union s a={’s’};//对
union s a={’s’,‘d’};//错

四·枚举类型

1.直接上例子吧:
enum weekday{ sun,mon,tue,wed,the,fri,sat };//成员为常量
2.枚举常量的默认值依次等于0,1,2,3,4·····
或者可以给其中一个赋值,则其后的默认值为前一个+1.
enum weekday{ sun,mon,tue=5,wed,the,fri,sat };
则sun=0,mon=1,tue=5,wed=6,the=7,fri=8,sat=9

五·指针与结构体

1.指向结构体的指针变量 可以和前面的指向函数的指针变量,指向字符的指针变量横向对比。其实都类似。
所以它的定义方式和前面的没啥区别。
类型 * 变量名
struct student
{
};
struct student a,*p;
p=&a; 所以:a.name等价于 (*p).name等价于p->name
2。用指向结构体的指针作为函数参数:
这句话听起来很绕,其实就是指针作为函数参数,(指针类型为指向结构体的指针)
下面举个例子:
void ff(struct student *p)
main()
{
struct student a;
ff(struct &a);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值