默认执行顺序(从上到下执行)
//输入是否好好学习(0/1)如果是0打印赶紧好好学习如果是1打印你特别棒 #include<stdio.h> #include<string.h> int main() { int num = 0; printf("你要好好学习么(请输入0/1)?"); scanf("%d",&num); if (num == 1) { printf("你特别棒"); } else { printf("赶紧好好学习"); } return 0; }
//输入年龄判断年龄段 #include<stdio.h> #include<string.h> int main() { int age = 0; printf("请输入年龄"); scanf("%d",&age); if (age < 18 && age>= 1) { printf("未成年"); } else if (age>= 10 && age<50) { printf("成年"); } else if(age>= 50 && age<=150){ printf("老年"); } else { printf("输入有误"); } return 0; }
//输入一个数判断是否是奇数 #include<stdio.h> #include<string.h> int main() { int num = 0; printf("请输入一个数字,系统将帮你判断它是不是奇数"); scanf("%d",&num); if (!(num %2)) { printf("是偶数"); } else { printf("是奇数"); } return 0; }
//打印0~100之间的奇数 #include<stdio.h> #include<string.h> int main() { for (int i = 1; i <= 100; i++) { if (i%2 != 0) { printf("%d \n", i); } } return 0; }
//输入数字打印星期几 #include<stdio.h> #include<string.h> int main() { int day = 0; printf("请输入数字,系统将为你打印出对应的星期数"); scanf("%d",&day); switch (day) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期日"); break; default: printf("输入有误"); } return 0; }
//输入数字判断是否是工作日 #include<stdio.h> #include<string.h> int main() { int day = 0; printf("输入数字,系统将为你判断是否是工作日"); scanf("%d",&day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日"); break; case 6: case 7: printf("休息日"); break; default: printf("输入有误"); } return 0; }
#include<stdio.h> #include<string.h> int main() { int num = 0; printf("开始学习\n"); while (num<20000) { printf("敲第%d行代码\n", num); num++; } if (num >= 20000) { printf("拿到好offer\n"); } return 0; }
getchar():输入一个char类型的字符
putchar():输出一个char类型的字符
//输入任意字符 程序打印出来 ctrl+z结束 #include<stdio.h> #include<string.h> int main() { char str = 0; printf("请输入一个字符"); while ((str = getchar()) != EOF) { putchar(str); } return 0; }
//getchar()应用 #include<stdio.h> #include<string.h> int main() { int ret = 0; char password[20] = { 0 }; printf("请输入密码 \n"); scanf("%s", password); while ( getchar() != '\n') { } printf("请确认Y/N \n"); ret = getchar(); if (ret == 'Y') { printf("%s \n", password); } else if (ret == 'N') { printf("N"); } return 0; }
#include<stdio.h> #include<string.h> int main() { int num[10] = { 0,1,2,3,4,5,6,8,9 }; int k = 7; int L = 0; int r = sizeof(num) / sizeof(num[0]) -1; int key = 0; while (r>= L) { key = (L + r) / 2; if (num[key] == k) { break; } else if(num[key] > k){ r = key - 1; } else { L = key + 1; } } if (r>= L) { printf("%d", key); } else { printf("没有"); } return 0; }
#include<string.h> #include<stdio.h> int main() { //HELLO WORD //********** char a[10] = "HELLO WORD"; char b[10] = "**********"; int L = 0; int R = sizeof(a) / sizeof(a[0]) - 1; while(L <= R) { b[L] = a[L]; b[R] = a[R]; L++; R--; printf("%s \n",b); } return 0; }
肯定执行一次
表达式二里面写着变量=0,循环只执行0次 因为表达式 变量= 0 的结果是0
// 求n的阶乘 #include<stdio.h> #include<string.h> int main() { int n = 5; long nn = 1; for (int i = 1; i <= n;i++) { nn *= i; } printf("%d",nn); return 0; }
//计算1!+......10! #include<stdio.h> #include<string.h> int main() { long nn = 1; long nnsum = 0; for (int i = 1; i <= 10; i++) { nn = 1; for (int j = 1; j < i; j++) { nn *= i; } nnsum += nn; } printf("%d",nnsum); return 0; }
#include<stdio.h> #include<string.h> int main() { int num1 = 10; int num2 = 20; int sum = 0; sum = Add(num1,num2); printf("%d",sum); return 0; } int Add(int a,int b) { return a + b; }
c本身的函数叫库函数 被频繁利用的函数 c封装起来提供给大家使用
自己定义的函数
自己掉自己的方法
一组相同类型的集合
#include<stdio.h> #include<string.h> int main() { int num[] = { 1,2,3,4,5,6,7,8,9,0 }; int i = 0; while (i<10) { printf("%d\n",num[i]); i++; } return 0; }
+ - * / %
>> <<
& | ^
! - + & sizeof() ~ -- ++ * ()
&& || !
二进制按位1的十进制对应数字
相加决定二进制对应位数字
16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
auto 自动变量 局部变量全部都是自动变量所以省略了
register 寄存器变量
signed 有符号变量
unsigned 无符号变量
struct 结构体
typedef 类型重定义
#include<stdio.h> #include<string.h> int main() { typedef unsigned int u_int; u_int num1; return 0; }
static 静态
修饰局部变量使生命周期边长 修饰全局变量和函数使作用域变小
#define 定义常量 定义宏
#include<stdio.h> #include<string.h> #define MAX(a,b)(a>b?a:b) int main() { int max = MAX(10, 9); printf("%d",max); return 0; }
EOF 文件结束标志就是-1(end of file)
指针大小取决于平台 如果是64位 指针占8个字节 如果是32位 指针占4个字节
#include<stdio.h> #include<string.h> int main() { int a = 10; int* p = &a; return 0; }
虽然不同类型指针占的内存空间在相同平台上是一样的,但是指针里面存的是堆里面的地址,不同类型地址在堆里面占的空间是不一样的,这样你用不同类型的指针进行相互操作会产生不可预料的结果(比如赋值时不同类型的指针在堆里面的相对空间不一致所以改的空间也会出现去偏差 / 再比如指针类型加数字时指针类型决定了加的空间大小)
#include<stdio.h> #include<string.h> int main() { int arr[5] = {0,1,2,3,4}; int* p = arr; for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); memset(arr,0x00,sizeof(arr)); for (int i = 0; i < 5; i++) { printf("%d", arr[i]); } printf("\n"); for (int i = 0; i < sizeof(arr)/sizeof(arr[0]);i++) { *(p + i) = 1; } for (int i = 0; i < 5; i++) { printf("%d", arr[i]); } printf("\n"); printf("%d \n", sizeof(arr) / sizeof(arr[0])); return 0; }
void* 没有类型的指针 可以接收任何类型的指针
指针指向的位置是不确定的
指针不出初始化会导致野指针的现象
指针不知道初始化为什么时让其指向null
局部变量不初始化,默认是随机值,局部变量(指针)指向的内存就是随机值你改它时就不确定改了哪
//野指针举例 #include<stdio.h> int main() { int* P ; *P = 9; return 0; }
指针越界访问时会产生野指针(数组最大下标后面的空间)
//野指针举例 #include<stdio.h> int main() { int a[10]={0} int* P = a ; for(int i = 0; i < 12; i++){ *p = i; p++; } return 0; }
指针指向的内存空间被释放了(调用方法中的局部变量)
//野指针举例 #include<stdio.h> int* text() { int a = 0; return &a; } int main() { int* P = text();//当方法text执行完毕的时候局部变量a的内存空间已经被回收了 *P = 9; return 0; }
//strlen #include<stdio.h> #include<string.h> int my_len(char * arr) { char* start = arr; char* end = arr; while (*end != '\0') { end++; } return end - start; } int main() { char arr[] = "qwe"; int len = my_len(arr); printf("%d",len); return 0; }
可以利用数组空间是连续的 可以用指针比较空间的前后位置就是比较大小
C语言中规定允许指向数组元素的指针与指向最后一个元素后面那个内存位置的指针进行比较,但是不允许与第一个元素前面那个内存位置进行比较
//正确写法啊 for(p = & arr[val]; p>&arr[0];){ *--p = 0; }
#include<stdio.h> #include<string.h> int main() { int arr[5] = { 0,1,2,3,4 }; int* p = arr; for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("\n"); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { *(p + i) = 1; } for (int i = 0; i < 5; i++) { printf("%d", arr[i]); } printf("\n"); return 0; }
一级指针的指针
二维数组的变量名相当于二级指针不能将其赋值给一维指针
#include<stdio.h> int main() { int a = 0; int* p = &a; int** pp = &p;//二级指针 return 0; }
存放指针的数组
指针数组访问的时候也要指针(*)加数组(按不出[ ])
#include<stdio.h> int main(){ int a = 10; int b = 10; int c = 10; int* abc[] = { &a,&b,&c }; for (int i = 0; i < 3; i++) { printf("%d",*(abc[i])); } return 0; }
char (*p)[4] char[4]*p
存放的是一个数组的地址 大小取决于下标