C语言-定义与初始化总结

1 实型

实型分为十进制小数类型和指数形式,其中指数形式,规定以字母e和E代表以10为底的指数,但应注意:e或E之前必须有数字,且e或E后面必须为整数。

  • 正确示例:12.34e3、-346.87e-25、0.145E-25、1.2e0、123e03
  • 错误示例:e4、12e2.5

2 标识符

除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。标识符只能由字母(A~Z, a~z)、数字(0-9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。C语言标识符区分大小写。

  • 正确示例:a、x、x3、BOOK_1、sum5
  • 错误示例:3s、-3x、bowy-1、s*T

C语言虽然不限制标识符的长度,但是它受到不同编译器的限制,同时也受到操作系统的限制。例如在某个编译器中规定标识符前128位有效,当两个标识符前128位相同时,则被认为是同一个标识符。

3 变量

可以定义多个变量并为多个变量赋初值,如

int a, b, c=5; // 正确
int a=3, b=3, c=3; // 正确
int a=b=c=3; // 错误

4 一维数组

4.1 注意点

  • 数组大小可以使用常量或者符号常量,如int a[3+5];,但是不能使用变量,如int a[n];但C99支持这种做法
  • 在被调用函数中定义数组,可以使用变量,如
void func(int n) {
	int a[2*n];
}
  • 如果指定数组为静态数组,则不能使用可变长数组,如static int a[2*n];就是错误的。

4.2 初始化

  • 在定义数组时对全部数组元素赋初值,如
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  • 可以对数组中一部分元素赋初值,则只给前五个元素赋值,后5个赋值0,如
int a[10] = {0, 1, 2, 3, 4};
  • 可以初始化全部为0,如
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int a[10] = {0};
  • 初始化可以不指定长度,如
int a[] = {1, 2, 3, 4, 5};

5 二维数组

5.1 初始化

  • 分行给二维数组赋初值,如
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
  • 可以将数据写在一个括号里赋初值,如
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  • 可以对部分元素赋初值,这样对各行第一个元素赋初值,其他的为0,如
int a[3][4] = {{1}, {5}, {9}};
/*
    1 0 0 0
    5 0 0 0 
    9 0 0 0
*/
  • 可以对各行中某一元素赋初值,如
int a[3][4] = {{1}, {0, 6}, {0, 0, 11}};
/*
    1 0 0 0
    0 6 0 0 
    0 0 11 0
*/
  • 可以只对某行几个元素赋初值,如
int a[3][4] = {{1}, {5, 6}};
/*
    1 0 0 0
    5 6 0 0 
    0 0 0 0
*/
  • 也可以对其中一行不赋值,如
int a[3][4] = {{1}, {}, {9}};
/*
    1 0 0 0
    0 0 0 0 
    9 0 0 0
*/
  • 如果对全部元素赋初值,则一维长度可以省略,二者等价,如
int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  • 可以只对部分元素赋初值并省略一维长度,如
int a[][4] = {{0, 0, 3}, {}, {0, 10}};
/*
    0 0 3 0
    0 0 0 0 
    0 10 0 0
*/

6 字符数组

6.1 初始化

  • 把各个字符依次赋值给数组,数量大于数组长度会报错,数量小于数组长度会将剩下的位置赋值为\0,如
char c[10] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
  • 二维字符数组,如
char c[2][3] = {{'y', 'o', 'u'}, {'a', 'r', 'e'}};
  • 用字符串常量来初始化字符数组,三者等价,此时系统会在末尾加上一个\0,所以实际长度会是字符串长度+1,若给定了字符数组的长度,而字符串长度小于字符数组定义长度,其余位置会赋值\0,如
char c[] = {"I am happy"};
char c[] = "I am happy";    // 可以省略花括号
char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '\0'}; // 与上面等价

6.2 与字符指针的比较

  • 字符数组存放若干元素,字符指针存放字符串的首地址
  • 可以对字符指针赋值,但不能对数组名赋值,如
char *p;
p = "I love China"; // 正确

char c[14];
c = "I love China"; // 错误
c[14] = "I love China"; // 错误
  • 字符数组中各元素的值是可以改变的(可以再次赋值),字符指针指向的字符串常量是不能再次赋值的,如
char a[] = "china";
char *b = "china";
a[2] = 'r'; // 正确
b[2] = 'r'; // 错误

7 结构体

7.1 声明定义

  • 先声明,再定义,如
struct Student {
	char name[20];
	int age;
};
struct Student student1, student2; // 定义了两个Student结构体
  • 在声明类型的同时定义变量,如
struct Student {
	char name[20];
	int age;
}student1, student2;
  • 匿名结构体,直接定义变量,如
struct {
	char name[20];
	int age;
}student1, student2;

7.2 初始化

  • 定义结构体并初始化
struct Student {
	char name[20];
	int age;
}student1 = {"xiaoming", 20};
  • C99允许对某个成员初始化,则其他变量默认初始化0,如
struct Student student1={.age=12}; // 只对age进行初始化
  • 同类型结构体变量可以相互赋值,如
student1 = student2;
  • 定义结构体数组并初始化,如
struct Student {
	char name[20];
	int age;
}student[2] = {"xiaoming", 20, "lihao", 15};
  • 定义时初始化,如
struct Student student[2] = {"xiaoming", 20, "lihao", 15};

7.3 结构体指针

struct Student *p = student1;,使用p->age代替(*p).age(.优先级大于*,括号不能省),以下三种写法等价

student1.age;
(*p).age;
p->age;

8 共用体

共用体union可以用一段内存存放不同类型的变量,它在每一瞬间只能存放其中一个成员,对共用体变量多次赋值,只保留最后一次赋值的值,共用体变量所占的内存长度等于最长的成员长度,初始化跟结构体有点像。

  • 声明并定义共用体,如
union Data {
	int i;
	char ch;
	float f;
}a, b, c;
  • 可以声明和定义分开,如
union Data {
	int i;
	char ch;
	float f;
};
union Data a, b, c;
  • 初始化方法,如
union Data {
	int i;
	char ch;
	float f;
}a = {1, 'a', 1.5}; // 错误,不能同时初始化3个
union Data a = {16}; // 正确
union Data a = {.ch='j'}; // 正确 C99新增
  • 对共用体赋值要指明赋值对象,如
a.ch = 'A'; // 正确
a.f = 1.5;  // 正确
a.i = 40;   // 正确
a = 1;      // 错误,没有指明赋值对象
  • C99 允许共用体之间相互赋值,允许共用体变量作为函数参数

9 枚举

如果变量有几种可能的值,则可以定义枚举,即把可能的值一一列举出来,变量的值只限于举例出来的值范围内,每一个枚举变量范围取值代表一个整数,从0开始递增。

  • 声明枚举类型,如
enum Weekday {sun, mon, tue, wed, thu, fri, sat};
  • 定义枚举类型,如
enum Weekday workday, weedkend;
  • 赋值,如
workday = mon; // 正确
workday = sun; // 正确
Weekday = monday; // 错误,monday不是范围类的取值
  • 可以人为的指定枚举元素的取值,如
enum Weekday {sun=7, mon=1, tue, wed, thu, fri, sat};
// sun=7, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6
  • 枚举元素可以用来做判断比较,通过初始化时的整数进行比较,如
if (workday == mon){} // 正确
if (workday > sun){} // 正确
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值