## 数据类型,变量,常量,字符串,转义字符,注释,选择语句,循环语句,函数,数组,操作符,常见关键字,define定义常量和宏,指针,结构体
第一个c语言程序
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("Hello World!\n");
system("pause");
return 0;
}
其中main为入口函数,一个工程中main函数有且只有一个。
数据类型
常见数据类型有:
char //字符数据类型,占1字节
short //短整型,占2字节
int //整型,占4字节
long //长整型,占4字节
long long //更长的整型,占8字节
float //单精度浮点数,占4字节
double //双精度浮点数,占8字节
一个变量定义时,主要由内存空间和数据内容两部分构成,而数据类型的大小往往决定的是内存空间的大小。
需要注意的是:c语言中没有特定的字符串类型哦
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
system("pause");
return 0;
}
下图为各种数据类型所占空间大小:
其中sizeof决定特定类型开辟的空间大小,它不是函数,属于操作符。
变量
变量的分类
- 局部变量
- 全局变量
#include<stdlib.h>
#include<stdio.h>
int year = 2019;//全局变量
int main()
{
int last = 2018;//局部变量
int year = 2020;//局部变量
printf("year=%d\n", year);
system("pause");
return 0;
}
//输出结果为year=2020
局部变量具有临时性,而全局变量在程序运行的整个周期都存在。
上面的局部变量year的定义是没有问题的,它与全局变量year同名,当出现这种情况时,局部变量优先使用。
变量的作用域和生命周期
作用域
通俗说,限定一段程序代码中所用到的名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域:变量所在的局部变量范围
- 全局变量的作用域:整个工程
生命周期
变量的生命周期指的是变量从创建到变量的销毁之间的一个时间段。
- 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
- 全局变量的生命周期:整个程序的生命周期
常量
c语言中的常量分为以下几种:
- 字面常量
- const 修饰的常变量
- #define 定义的标识符常量
- 枚举常量
字符串
“hello world.\n”
这种由双引号引起来的一串字符称为字符串字面值,简称字符串。
注:c语言中字符串以 \0 结束,是一个c风格字符串。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
#include<stdlib.h>
#include<stdio.h>
int main()
{
char arr1[] = "hi";
char arr2[] = { 'h','i' };
char arr3[] = { 'h','i','\0' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
printf("%d\n", sizeof(arr3));
system("pause");
return 0;
}
切记:sizeof是求目标类型占据的总空间,strlen求的是字符串长度!!!
转义字符
转义字符 | 输出结果 |
---|---|
\? | 输出字符 |
\’ | 具有此八进制码的字符 |
\" | 输出此字符 |
\\ | 输出此字符 |
\a | 警告,产生声音或视觉信号 |
\b | 退格,将当前位置后退一个字符 |
\f | 换页,将当前位置移到下一页的开头 |
\n | 回车换行,将当前位置移到下一行的开头 |
\r | 回车,将当前位置移到本行的开头 |
\t | 水平制表符,将当前位置移到下一个tab位置 |
\v | 垂直制表符,将当前位置移到下一个垂直制表对齐点 |
\ddd | 1~3位八进制数所代表的任意字符 |
\xhh | 1~2位十六进制所代表的任意字符 |
\ 既能将字面值转为特殊值,又能将特殊值转为字面值。
字符 0 经转义 ( \ 0 ) 后就是 0。
某笔试题:
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n",strlen("abcdef"));//strlen求字符串长度,不算\0
printf("%d\n", strlen("c:\test\328\test.c"));//\32被解析为一个转义字符,\t为1个字符
system("pause");
return 0;
}
//结果分别为:6,14
注意:求sizeof()时才算\0,求strlen时不算\0。(前面有提到)
sizeof不是函数,属于操作符,strlen是一个函数。
注释
- /*…*/ 缺陷:不能嵌套使用
- //… 可以注释一行也可以注释多行
- if(0){…} 不推荐
选择语句
- if-else
- switch-case
循环语句
- while语句
- for语句
- do…while语句
数组
定义:一组相同类型元素的集合。
数组的使用:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//初始化
for (i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
//结果:12345678910
数组可以被整体初始化,但不能被整体赋值。
操作符
- 算术操作符
+ - * / %
- 移位操作符
>> <<
- 位操作符
& ^ |
- 赋值操作符
= += -= *= /= &= ^= |= >>= <<=
- 单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
- 关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
- 逻辑操作符
&& 逻辑与
|| 逻辑或
- 条件操作符
exp1 ? exp2 : exp3
- 逗号表达式
exp1 , exp2 , exp3 , … expN
- 下标引用、函数调用和结构成员
[] () . ->
常见关键字
auto break case char const(声明一个变量为常量) continue default do double else enum(枚举) extern float for goto if int long register(定义寄存器变量) return short signed sizeof static(静态) struct switch typedef union(联合体) unsigned void volatile(易变关键字) while
关键字typedef
顾名思义是类型定义(类型重命名)
typedef unsigned int uint_32;
//将unsigned int重命名为uint_32,所以uint_32也是一个类型名
int main()
{
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
关键字static
在c语言中:
static是用来修饰变量和函数的
- 修饰局部变量-静态局部变量
- 修饰全局变量-静态全局变量
- 修饰函数-静态函数
修饰局部变量
代码1:
#include<stdio.h>
#include<stdlib.h>
void test()
{
int i = 0;//i每次都被释放,初值变为0
i++;
printf("%d", i);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
test();
}
system("pause");
return 0;
}
//结果为1111111111
代码2:
#include<stdio.h>
#include<stdlib.h>
void test()
{
//static修饰局部变量
static int i = 0;//初始化
i++;
printf("%d", i);
}
int main()
{
int i;
for (i = 0; i < 10; i++)
{
test();
}
system("pause");
return 0;
}
//结果为12345678910
结论:
static修饰局部变量改变了变量的生命周期,到程序结束,生命周期才结束,作用域不变。
修饰全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
修饰函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
define定义常量和宏
//define定义标识符变量
#define MAX 1000 //MAX为宏名称
#define ADD(x,y) ((x)+(y))
#include<stdio.h>
#include<stdlib.h>
int main()
{
int sum = ADD(2, 3);
printf("sum=%d\n", sum);
sum = 10 * ADD(2, 3);
printf("sum=%d\n", sum);
system("pause");
return 0;
}
//结果为:sum=5
// sum=50
指针
1.保存地址的变量
2.为了提高效率
内存
每个内存单元的大小是一个字节。为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
%p 以地址的形式打印
*p 代表p所指向的目标
指针变量的大小
指针大小在32位平台是4个字节,64位平台是8个字节。
结构体
结构体中可以定义不同类型。
可以被整体初始化,但不能被整体赋值。