C语言基础学习03

2021/9/8 23:07:14

本文主要是介绍C语言基础学习03,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

顺序结构

默认执行顺序(从上到下执行)

选择语句

//输入是否好好学习(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;
}

if语句

//输入年龄判断年龄段
#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;
}

switch语句

//输入数字打印星期几
#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;
}

while语句

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;
}

do while语句

肯定执行一次

for语句

表达式二里面写着变量=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;
}

goto语句

函数

#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的十进制对应数字

相加决定二进制对应位数字

168421
00000

关键字

  • 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

存放的是一个数组的地址 大小取决于下标



这篇关于C语言基础学习03的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程