数据类型
char ch='a' //字符类型 一个字节
int age= 20 //整型 四个字节
short num= 10 // 短整型 四个字节 long //长整型 四个字节 long long//长长整型 八个字节
float weight = 55.5//单精度浮点型 四个字节
double d =0.0//双精度浮点型 八个字节
%d 打印整型 printf ("%d\n",100) %c字符打印 %s字符串打印 %f 打印float %lf打印double sizeof 关键字 操作符 计算机类型或者变量所占空间的大小
printf("%d\n",sizeof(char)); //计算char的字节
计算机中的单位
bit :一个二进制位 byte(字节)=8bit kb=1024 byte mb =1024 kb gb=1024 mb
数据类型用于变量和常量
变量分类:全局变量 , 局部变量
int a = 100 //全局变量在{}外部定义的
int main //当全局变量和局部变量名字冲突的时候,局部变量优先。
{ //当然不建议把全局变量和局部变量的名字写成一致的。
int a =10; //局部变量,在{}内部定义的
return 0;
}
scanf:函数的输入 格式 scanf("%d %d",&a ,&b)//&他们所在的位置
变量的作用域和生命周期
//变量的生命周期:变量的创建和销毁之间的时间段
局部变量的作用域:就是变量所在的局部范围
全局变量的作用域:整个工程
局部变量的生命周期:进入局部范围生命开始,出具不范围生命结束
全局变量的生命周期:程序的生命周期
常量(四种)
1、字面常量
2、const修饰的常变量
const int num =10;
int num =20;(×)//程序无法更改
3、#define定义的标识符常量
# define Max 100;//以后见到Max就是100
4、枚举常量(可以一一列举的常量)
enum sex
{
MALE //从0开始
FEMALE // 1
SECRET // 2
}//括号中的三个为枚举常量
字符串+转义字符
字符串就是一串字符----用双引号括起来的一串字符 如"hello everyone \n"
字符数组----数组就是一组相同类型的元素
字符串在结尾的位置隐藏了一个‘\0’的字符 \0是字符串结束的标志(计算长度的时候不包含\0)
# include<string.h>
char arr1 []="abc";
char arr2[]={'a','b','c'};
printf("%s \n",arr1); // abc
printf("%c \n",arr2); //abc+一些乱码
介绍 strlen() 函数 在使用时要引用头文件 #include <string.h>
printf("%d \n",strlen(arr1)); (3) // abc\0
printf("%d \n",strlen(arr2)); (随机) // abc ????什么时候找到\0什么时候结束
也可以换一种方式
int len = strlen(arr1);
printf("%d \n",len)
转义字符 转变了它原来的意思
\n \t \0......重点介绍一些难以理解的\ddd \xdd
\ddd ddd表示1~3个八进制的数字 如\130
\xdd dd表示2个十六进制的数字 如\x30
int main
{ printf("%c \n",'\130'); (x) // 八进制的130是十进制的88 X的AscⅡ码是88
printf("%c \n",\x30); (o) //十六进制的30 是十进制的48 O的AscⅡ码是48
return 0 ;
}
计算一道例题printf("%d \n",strlen("c:\test\328\test.c"))(14) //八进制里面不能包含8
选择语句 :这里先不做介绍
函数 需要用代码来说明
正常代码
# include<stdio.h>
int main()
{
int num1=0;
int num2=0;
scanf("%d %d ",&num1,&num2);
int num=num1+num2;
printf("%d\n",num);
return 0;
}
函数代码
int Add (int x,int y)
{
int z =0;
z= x+y;
return z; \\将所得的z值返回到主函数中去
}
int main()
{
int num1=0;
int num2 =0;
scanf("%d %d",&num1,&num2);
int sum =Add (num1,num2);
printf("%d \n",num);
return 0;
}
数组 : 一组相同类型的元素的集合
int arr [10]={1,2,3,4,5,6,7,8,9,10};
int i;
while (i<10)
{
printf("%d",arr[i]); //下标访问从0开始,采用下标的访问方式
i ++;
}
int char [5] ={'a','b','c'} //不完全的初始化,剩余的默认为0
操作符
算数操作符:+ - * / (除) %(取余) 9/2.0=4.5(小数) 9/2=4(整数) 9%2=1(取余)
移位操作符 :>>(右移) <<(左移) //移的是二进制数
位操作符 :& 按位与 | 按位或 ^ 按位异或
赋值操作符 :a=a+5 //a+=5 b=b-1 //b-=1
负数在内存中存储的时候,存储的是二进制的补码;打印的,使用的是这个数的原码。
++ :a++ 后置++ :先使用,后++ int a =10;int b=a++; (a=11,b=10)
:++a 前置++ :先++,后使用 int a= 10; int b=++a;(a=11,b=11)
--同理
()强制类型转化 int a =3.14 (×) int a= (int) 3.14 (不太推荐使用)
&& 逻辑与 ||逻辑或 (不做具体的介绍了)
条件操作符 exp1 ?exp2:exp3 //exp1表达式为真执行exp2,否则执行exp3
常见关键字
typedef :类型重定义
例如 :typedef unsigned int =u_int ;
u_int num = 20; //unsigned int num = 20;
static
1、static修饰局部变量,局部变量的生命周期变长了
2、static修饰全局变量,改变了变量的作用域,让静态的局部变量只能在自己所在的源文件中使用,出了源文件就无法使用了。
3、static修饰函数,改变了函数的链接属性,由外部链接属性-------内部链接属性
举例 第一种的情况
void test ()
{
(static) int a;//a此时为一个静态的局部变量
a++;
printf("%d \n",a)
}
int main
{
int i= 0;
while (i< 5)
{
test();
i++;
}
return 0;
}
没有static的时候输出答案为2 2 2 2 2 a为局部变量出了循环体a就消失了,加上static的时候,a的生命周期变长了输出答案为2 3 4 5 6
宏 简单介绍 #define add(x,y)(x+y)
指针:有一种变量用来存放地址的成为指针变量
代码说明
int main()
{
int a = 10;//四个字节
int *p =&a;//取地址
printf("%p \n",&a);//一样的效果和下一行
printf("%p\n",p);
*p = 20; //*为解引用操作符 所以此时a为20
return 0;
}
指针大小:32位平台指针为4个字节,64位平台指针为8个字节
结构体 :描述复杂对象——自己创造出来的一种类型
struct Book
{
char name[20];
short price;
};
int main //利用结构体类型——创建一个该类型的结构体变量
{
struct Book b1={"c语言程序设计",55};
printf("书名:%s \n",b1·name);
printf("价格:%d\n",b1·price);
return 0;
}
指针形式打印:struct Book b1={"c语言程序设计",55};
struct Book*pb=&b1;
printf("%s\n",(*pb).name);
printf("%d\n",(*pb).price);
另一种形式打印:printf("%s \n",pb→name);
printf("%d\n",pb→price);
//·结构体变量 · 成员,结构体指针→成员