前言
本章内容总结了声明,概述了结构体、函数声明、以及typedef等知识点。
C语言 | 快速了解C的发展史🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 指针、数组 一文透彻~~~🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 结构体、联合、枚举🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 声明🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 作用域 在也不用担心分不清变量的作用域拉!!!🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 编译步骤 会用C还不知道C如何编译???🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 数据类型总结🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 位及进制的用法🧡💛💚💙
文章目录
一、声明的含义是什么?与定义有什么区别?
声明是为了提前告知编译器该变量或者该函数类型已被预定,故需要遵循编译器的语法;
- 需注意,声明与定义可以说是俩回事。定义时,则编译器会为其分配内存,而声明只是单纯的声明某个变量或类型;
- 声明不需要分配内存,但该声明的名字已在内存上;
- 声明能够多次,而定义只能一次。
1.1 声明常使用的关键字
- const;
- volatile;
- typedef。
二、几种声明
- 函数声明;
- 结构体声明;
- 联合声明;
- 枚举声明;
- 指针与数组声明;
2.1 函数声明
函数声明常与typedef结合,一般用于较复杂的函数指针及参数、返回值;
2.1.1 几种常见的函数声明
函数返回值类型 (* 指针变量名) (函数参数列表)
;
以下几种根据以上的公式进行扩展使用。
普通函数指针
// 普通的指针声明,参数为int类型
int (*func)(int);
返回函数指针
// 返回一个函数指针,参数为int类型
int (*func1(int i))();
# 进行拆分
(*func1(int i))、int()();
# ---
# (*func1):为指针变量名
# (int i):为参数列表
# int ()():返回一个函数指针
返回一个指向数组的指针
// 返回一个函数数组,参数为int类型
int (*func2(int x))[];
# 进行拆分
(*func2(int x))、int ()[]
# ---
# (*func2):为指针变量名
# (int x):为参数列表
# int ()[]:返回一个函数数组
函数数组
// 定义一个函数数组,存储的函数返回值为int类型,参数也int类型
int ((*func3[])(int x));
# 进行拆分
(*func3[])、int()、(int x)
# ---
# (*func3[]):为函数指针数组
# (int x):为参数列表
# int():返回值为int类型
// 定义一个函数数组
typedef int(*f)(int x, int y);
int test(int x, int y){
printf("");
}
f num[100] = {
test
};
2.2 结构体声明
struct 结构标签(可选){
int i,
}变量定义;
- 变量的申明与类型的声明应分开;
- 尽量少用typdef在结构体上,声明带上strutc在阅读上回更加直观;
- 若数组在结构体中进行传参,则不会传入数组首地址,是传值操作;
2.3 typedef
使用typdef将会给该类型创建一个新标签,但不会为其分配空间。
- 类似于宏文本替换,但与宏的区别所在与它并不会引入新类型。
- 不能使用
,
进行多个声明;- typedef不能嵌套在中间部分;
typedef的使用
#include<stdio.h>
#include<stdlib.h>
typedef void (*func)(int);
func test(int x){
static int y = x;
printf("test typedef: %d\n", x);
return NULL;
}
void main()
{
int x = 1;
test(x);
system("pause");
}
2.3.1 typdef与#define的区别
- 两者类似,但typedef不会引入新类型;
- typedef声明厚不能拓展,而define却可以再次更改其属性;
- typedef声明可保证均为同一属性;
typedef int * dataType;
dataType x, y; // x和y都为int类型
#define dataType int *;
dataType x, y; // 由于#define为宏替换,则表达式变为int *x, y;故x为整型指针,y为整型