一、数据类型
char
short
int
long
long long
float
double
double d = 3.14;
printf("%lf\n", d);
unsigned char i ;
char i
1.为什么出现这么多类型?
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));
注:同一类型的有符号数和无符号数所占字节数相同
short int age = 20;
即,为了更加丰富的表达生活中的各种值
数据的存放方式
常量与变量
1.作用域
当局部变量和全局变量相同时,局部变量优先。
scanf("%d%d",&num1,&num2);
#define _CRT_SECURE_NO_WARNINGS 1
声明extren外部符号的
extern int g_val;
printf("g_val = %d\n", g_val);
2.变量的生命周期
- 局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期:整个程序的生命周期
3.常量
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
const int num = 4;
num = 8
int n = 10;
int arr[n] = {0};
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
printf("%d\n",MALE);
printf("%d\n",FEMALE);
printf("%d\n",SECRET);
enum Sex sex = MALE;
sex = FEMALE;
FEMALE = 6;
}
数组 字符串
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
char arr3[] = {'a','b','c','\0'};
printf("%s\n",arr1);
printf("%s\n",arr2);
printf("%s\n",arr3);
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",strlen("c:\test\32\test.c"));
char arr4[5] = {'a',98};
printf("%d\n",sizeof(arr4));
printf("%d\n",sizeof(arr1));
}
1.二维数组
int arr[][4] = {{1,2,3,4},{5,6,7,8}};
参数是数组的形式 参数是指针的形式
*((*p+i)+j) = (*(p+i)[ j ])
指针
存放内存单元的地址,内存单元以字节为单位 *–>解引用操作符 指针大小在32位平台是4个字节
double d = 3.14;
double* pd = &d;
指针类型决定了指针解引用操作的时候,能够访问空间的大小
int *p;
char *p;
指针类型决定了指针的步长
int *p;
cahr *p;
double *p;
1.指针数组
2.数组指针
3.总结
指针进阶
1.函数指针
2.函数指针的数组
可代替switch语句
3.指向函数指针数组的指针
排序函数
字符串函数
关键字(static define)
static修饰局部变量:使得局部变量的生命周期变长 static修饰全局变量:使得全局变量的作用域变窄,另一函数进行extern声明时发生错误 static修饰函数:改变了函数的链接属性,使得外部链接属性转化为内部链接属性
宏定义
#define MAX(X,Y) (X>Y?X:Y)
int main()
{
max = MAX(a,b);
}
结构体
struct Book
{
char name[20];
};
int main()
{
struct Book b1 = {"CCC"};
struct Book* pb = &b1;
printf("%s\n",b1.name);
printf("%s\n",(*pb).name);
printf("%s\n",pb->name);
b1.name = "uuuu"
strcpy(b1.name,"uuuu");
}
循环
int i = 1;
while(i<10)
{
if(i == 5)
continue;
printf("%d",i);
i++;
}
while(ch = getchar()! = EOF)
{
putchar(ch);
}
char password[20] = {0};
scanf("%s",password);
ret = getchar();
while(ch=getchar()!='\n')
{
;
}
for语句的循环控制变量: 1.不可在for循环体内修改循环变量,防止for循环失去控制 2.建议for语句的循环控制变量的取值采用“前闭后开区间”的写法
int i=0,k=0;
for(i=0,k=0;k=0;i++)
k++;
#include<windows.h>
Sleep(1000);
#include<stdlib.h>
system("cls");
srand((unsigned int) time());
ret = rand()
函数
1.函数的调用
形参实例化之后其实相当于实参的一份临时拷贝。
而传址调用可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
printf函数返回的是字符的个数
2.递归
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续
int my_strlen(char *str)
{
if(*str!='\0')
return 1+my_strlen(str+1);
else
return 0;
}
3.数组作为函数参数
buble_sort(arr,sr);
4.指针作为参数
操作符
1.算术操作符
除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2.移位操作符
1.算术右移:右边丢弃,左边补原符号位 2.逻辑右移:左边补零
3.逻辑操作符
^异或运算,相同为0,不同为1
!逻辑反操作
EOF:文件结束标志
取反
int a = 0;
int b = ~a;
动态内存
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
int* p = (int *)malloc(10*sizeof(int));
if(p==NULL)
{
printf("%s",strerror(errno));
}
free(p)
p=NULL;
return 0;
}
柔性数组
文件操作
|