【C语言】从printf到pointer全过程

C语言程序设计

请添加图片描述

HelloWorld

#include<stdio.h>
#include<stdlib.h>

int main()
{
    printf("Hello world!\n");
    return 0;
}

变量

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char characterName[] = "John";
    int characterAge = 35;
    printf("There once a man named %s\n", characterName);
    printf("he was %d years old.\n",characterAge);

    characterAge = 30;
    printf("He really liked the name %s\n",characterName);
    printf("but did not like being %d.\n",characterAge);

    return 0;
}

数据类型

#include<stdio.h>

int main()
{
    int age = 40;
    double gpa = 3.6;
    char grade = 'A';
    char phrase[] = "ABCD EFGH";

    return 0;
}

printf

#include <stdio.h> // 引入标准输入输出库的头文件

int main() {
    // 声明并初始化变量
    int integerVar = 10;
    float floatVar = 3.14159f;
    double doubleVar = 2.718281828459045;
    char charVar = 'W';
    char stringVar[] = "Hello, World!";

    // 打印整数
    printf("整数:%d\n", integerVar);

    // 打印浮点数,保留两位小数
    printf("浮点数(保留两位小数):%.2f\n", floatVar);

    // 打印双精度浮点数,保留十位小数
    printf("双精度浮点数(保留十位小数):%.10lf\n", doubleVar);

    // 打印字符
    printf("字符:%c\n", charVar);

    // 打印字符串
    printf("字符串:%s\n", stringVar);

    // 打印混合类型
    printf("混合打印:%d, %.2f, %.10lf, %c, %s\n", integerVar, floatVar, doubleVar, charVar, stringVar);
    
    // 打印转义字符
    printf("换行符打印实例。\n新的一行开始了。\n");
    printf("Tab制表符的效果:\t这里是Tab的空格。\n");
    printf("反斜杠打印实例:\\\n");
    printf("双引号打印实例:\"\n");

    // 打印格式化文本
    printf("打印宽度:%10d\n", integerVar); // 宽度为10,右对齐
    printf("打印宽度并填充:%010d\n", integerVar); // 宽度为10,左侧填充0

    return 0; // 程序执行成功返回0
}

数字计算

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
    // 幂函数
    double base = 10 ,x = 3.14159;
    double pow(base,x);
    double sqrt(base);//平方根
    double cbrt(base);//立方根

    // 指对数函数
    double exp(x);      //计算自然对数的底(e)的 x 次幂
    double log(x);      //计算 x 的自然对数
    double log10(x);    //计算 x 的以10为底的对数

    // 三角函数、反三角函数和双曲函数、反双曲函数
    double sin(x);
    double cos(x);
    double tan(x);
    
    double asin(x);
    double acos(x);
    double atan(x);

    double sinh(x);
    double cosh(x);
    double tanh(x);

    double asinh(x);
    double acosh(x);
    double atanh(x);

    // 舍入和绝对值函数
    double ceil(x); // 向上舍入
    double floor(x); // 向下舍入
    double fabs(x); // 绝对值

    return 0;
}

注释

#include<stdio.h>

int main()
{
    /*
    
    */
    
    // 滥用Comments不是个好习惯,一般只在关键的地方使用

    /**
     * 
    */
    return 0;
}

常量

#include<stdio.h>

int main()
{
    const int FAV_NUM = 5;
    printf("%d\n",FAV_NUM);
    // FAV_NUM = 10; // not allowed

    printf("Hello");    
    
    return 0;
}

scanf

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    int age;
    printf("Enter your age: ");
    scanf("%d",&age);
    printf("You are %d years old.\n",age);

    double gpa;
    printf("Enter your gpa: ");
    scanf("%lf",&gpa);
    getchar();  
    printf("Your gap is %.5lf.\n",gpa);

    // char型的前后都要使用getchar()消费存在于缓冲区结尾的换行符

    char grade;
    printf("Enter your grade: ");
    scanf("%c",&grade);
    getchar();  
    printf("Your grade is %c.\n",grade);

    char name[20];
    printf("Enter your name: ");
    // scanf("%s",name);   // 数组不用使用&符,因为它本身就是地址
    // getchar();  
    fgets(name,20,stdin);  // 可以读取一行,但是会把换行符包含在字符串中
    if (name[strlen(name) - 1] == '\n') {
        name[strlen(name) - 1] = '\0';
    }
    printf("Hello, %s. This is kyle.\n",name);
    return 0;
}

calculator

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char operator;
    double firstNumber,secondNumber;
    double result;
    int running = 1;// 控制计算器运行的变量

    printf("欢迎使用计算机\n");

    while(running){
        // 读取用户输入的运算符
        printf("输入操作(+,-,*,/),退出Q:");
        scanf("%c",&operator);
        getchar();

        // 如果输入为Q或q,退出循环
        if(operator == 'Q' || operator == 'q'){
            running = 0;
            continue;
            // break;
        }

        // 提示用户输入两个操作数
        printf("输入操作数1: ");
        scanf("%lf",&firstNumber);
        printf("输入操作数2: ");
        scanf("%lf",&secondNumber);

        switch (operator) {
        case '+':
            result = firstNumber + secondNumber;
            break;
        case '-':
            result = firstNumber - secondNumber;
            break;
        case '*':
            result = firstNumber * secondNumber;
            break;
        case '/':
            if(secondNumber != 0.0){
                result = firstNumber / secondNumber;
            }else{
                printf("除数为0.\n");
                continue;
            }
            break;
        default:
            printf("无效输入!\n");
            continue;
        }
        printf("Result = %.2lf %c %.2lf = %.2lf\n",firstNumber,operator,secondNumber,result);
    }
    printf("感谢您的使用,再见.\n");
    return 0;
}

madlibs game

#include <stdio.h>

int main() {
    char adjective[20];
    char color[20];
    char thing[20];
    char place[20];
    char profession[20];
    char animal[20];
    char name[20];
    
    printf("欢迎使用mad libs小游戏!\n");
    printf("请根据提示输入文字.\n\n");
    
    printf("输入一个形容词: ");
    scanf("%s", adjective);
    
    printf("输入一个颜色: ");
    scanf("%s", color);
    
    printf("输入一个东西: ");
    scanf("%s", thing);
    
    printf("输入一个地点: ");
    scanf("%s", place);
    
    printf("输入一个职业: ");
    scanf("%s", profession);
    
    printf("输入一个动物: ");
    scanf("%s", animal);
    
    printf("输入一个名字: ");
    scanf("%s", name);
    
    printf("\n下面是你的madlibs故事:\n\n");
    
    printf("There once was a %s %s who lived in %s. ", adjective, profession, place);
    printf("They always wore a %s hat and loved to play with his pet %s named %s. ", color, animal, name);
    printf("One day, they found a magic %s that could make any dream come true.\n", thing);
    
    return 0;
}

函数function

#include<stdio.h>

// 函数原型声明,函数定义如果在前可以没有函数声明
int addNumber(int num1,int num2);

int main()
{
    int num1,num2,sum;
    //获取用户输入
    printf("Enter first number: ");
    scanf("%d",&num1);
    
    printf("Enter second number: ");
    scanf("%d",&num2);

    sum = addNumber(num1,num2);
    printf("Sum = %d + %d = %d\n",num1, num2, sum);
    return 0;
}

// 函数定义
int addNumber(int num1,int num2)
{
    int res;
    res = num1 + num2;
    return res;
}

数组array

#include<stdio.h>
#include<stdlib.h>

void declare();
void initialization();
void index();
void traverse();
void multidimensionalArrays();

int main()
{
    declare();
    initialization();
    index();
    traverse();
    multidimensionalArrays();
    return 0;
}

void declare()
{
    int myNumbers[10]; // 声明一个整数数组,可以存储10个整数
    char myCharacters[5]; // 声明一个字符数组,可以存储5个字符
}

void initialization()
{
    int myNumbers[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 初始化一个整数数组
    char myCharacters[5] = {'a', 'b', 'c', 'd', 'e'}; // 初始化一个字符数组

}

void index()
{
    int myNumbers[5] = {5, 10, 15, 20, 25};
    printf("第一个元素: %d\n", myNumbers[0]); // 输出 5
    printf("第三个元素: %d\n", myNumbers[2]); // 输出 15

    // 更改第四个元素的值
    myNumbers[3] = 100;
    printf("第四个元素: %d\n", myNumbers[3]); // 输出 100
}

void traverse()
{
    int myNumbers[5] = {5, 10, 15, 20, 25};

    for (int i = 0; i < 5; i++) {
        printf("元素[%d]: %d\n", i, myNumbers[i]);
    }

}

void multidimensionalArrays()
{
    int myMatrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", myMatrix[i][j]);
        }
        printf("\n");
    }
}

条件语句

#include<stdio.h>
#include<stdlib.h>

void ifelseDemo();
void switchDemo();

int main()
{
    ifelseDemo();
    switchDemo();
    return 0;
}

void ifelseDemo()
{
    int score;
    printf("Enter your score: ");
    scanf("%d", &score);

    // 条件检查:根据分数判断等级
    if (score >= 90) {
        printf("Grade: A\n");
    } else if (score >= 80) {
        printf("Grade: B\n");
    } else {
        printf("Grade: C\n");
    }
}

void switchDemo()
{
    char grade;
    printf("Enter your grade (A , B, C):");
    getchar();
    scanf("%c",&grade); // char型读取前后用getchar()消费输入缓冲区的空白符,整型不会读取换行符,所以不需要
    switch (grade) {
        case 'A':
            printf("Excellent!\n");
            break;
        case 'B':
            printf("Well done\n");
            break;
        case 'C':
            printf("better try again\n");
            break;
        default:
            printf("Invalid grade\n");
    }
}

struct

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// typedef 为结构体定义了一个新名字
typedef struct Learner{ 
    char name[50];
    char major[50];
    int age;
    double gpa;
}Student;

int main()
{
    // struct Learner student1; 这里可以省略,因为已经用typedef定义了Student
    Student student1;
    student1.age = 22;
    student1.gpa = 3.14;
    // 字符数组不能通过简单的赋值操作来初始化或更改。
    // 需要使用字符串复制函数如 strcpy 或 strncpy 来实现。
    strcpy(student1.major,"CS");
    strcpy(student1.name,"Kyle");

    printf("%s\n",student1.name);
    printf("%s\n",student1.major);
    return 0;
}

while 循环

#include <stdio.h>
#include <math.h>

int main() {
    int number = __INT32_MAX__;

    int counter = 1;
    while (number != 0 && counter <= 5) {
        counter++;
        printf("Enter numbers (0 to stop): ");
        scanf("%d", &number);  // 继续读取下一个数
        if(number == 0){
            continue;
        }
        printf("You entered %d\n", number);  // 输出用户输入的数
    }

    printf("End of input.\n");

    return 0;
}

do_while

#include <stdio.h>
#include <math.h>

int main() {
    int number = __INT32_MAX__;
    int counter = 1;

    // 先执行一次
    do {
        printf("Enter numbers (0 to stop): ");
        scanf("%d", &number);  // 读取用户输入的数

        // 如果number为0,立即跳到循环开始,不执行后面的打印语句
        if(number == 0) {
            continue;
        }

        printf("You entered %d\n", number);  // 输出用户输入的数

        counter++;
    } while (number != 0 && counter <= 5);

    printf("End of input.\n");

    return 0;
}

for loop

#include <stdio.h>

int main() {
    int number;
    int counter;

    // for loop 由三部分组成, 初始化部分, 条件部分, 增量部分
    for (counter = 1, number = __INT32_MAX__; number != 0 && counter <= 5; ++counter) {
        printf("Enter numbers (0 to stop): ");
        scanf("%d", &number);  // 读取用户输入的数
        
        if (number == 0) {
            continue;  // 如果输入为0,跳过本次循环的剩余部分
        }

        printf("You entered %d\n", number);  // 输出用户输入的数
    }

    printf("End of input.\n");

    return 0;
}

guess game

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_TRIES 10
#define RANGE_LOW 1
#define RANGE_HIGH 100

int main() {
    int secretNumber, guess, tries = 0;

    // 初始化随机数生成器
    srand(time(NULL));
    // 生成一个范围在 RANGE_LOW 到 RANGE_HIGH 之间的随机数
    secretNumber = (rand() % (RANGE_HIGH - RANGE_LOW + 1)) + RANGE_LOW;

    printf("Welcome to the Guessing Game!\n");
    printf("I have selected a number between %d and %d. You have %d tries to guess it.\n", RANGE_LOW, RANGE_HIGH, MAX_TRIES);

    do {
        printf("Enter your guess: ");
        scanf("%d", &guess);
        tries++;

        if (guess > secretNumber) {
            printf("Too high! You have %d tries left.\n", MAX_TRIES - tries);
        } else if (guess < secretNumber) {
            printf("Too low! You have %d tries left.\n", MAX_TRIES - tries);
        } else {
            printf("Congratulations! You guessed the number in %d tries!\n", tries);
            return 0; // 猜对了就退出程序
        }
    } while (tries < MAX_TRIES);

    // 如果用完了所有尝试还没猜中,告知正确答案
    printf("Sorry, you've used all your tries. The correct number was %d.\n", secretNumber);
    return 0;
}

二维数组 & 嵌套循环

#include<stdio.h>

#define SIZE 5

int main()
{
    int table[SIZE][SIZE] = {
        {1,2,3,4,5},
        {1,2,3,4,5},
        {1,2,3,4,5},
        {1,2,3,4,5},
        {1,2,3,4,5}
    };

    // 使用嵌套循来填充这个数组
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            table[i][j] = (i + 1)*(j + 1); //计算乘法表的值
        }
    }

    // 使用嵌套循来打印这个数组
    for (int i = 0; i < SIZE; i++)
    {
        for (int j = 0; j < SIZE; j++)
        {
            printf("%4d",table[i][j]);  // 使用%4d来保持打印格式整齐
        }
        printf("\n");
    }
    return 0;
}

访问内存地址

#include <stdio.h>
/*
    (void*)&value:这里,&value 取得了变量 value 的地址,并且将该地址转换为一个 void* 类型的指针。这是最标准和通用的方法,因为 %p 用于打印 void* 类型的指针。不加的话会隐式转换成它,但是会有编译风险.
*/
int main() {
    int value = 10; // 声明一个整型变量
    int *pointer = &value; // 声明一个指向整型的指针并初始化为value的地址
    // 打印变量的值
    printf("value = %d\n",value);
    // 打印变量的地址
    printf("&value = %p\n",(void*)&value);


    // 指针变量的值    是指向变量的地址
    printf("pointer = %p\n",(void*)pointer);
    // 指针变量的地址  是指针变量的地址
    printf("&pointer = %p\n",(void*)&pointer);

    // 指针变量的解引用 是指针指向的变量
    printf("*pointer = %d\n",*pointer);
    // 因为
    printf("&(*pointer) = %p\n",(void*)&(*pointer)); 
    // 修改解引用也会修改所指向变量
    *pointer = 1000;
    printf("after *pointer = 1000, value = %d\n",value);

    // printf("------以下尝试获取地址的地址是非法的------\n");
    // printf("&(&value) = %p\n",(void*)(&(&value)));
    if( *pointer == value){
        printf("1");    // 输出了1
    }

    return 0;
}

指针pointer

#include<stdio.h>

void basicPointerOperations();
void pointerAndArray();
void addOne(int *p);
void pointerAndFunction();
void pointersAndDynamicMemory();

int main()
{
    basicPointerOperations();
    // pointerAndArray();
    // addOne(int *p);
    // pointerAndFunction();
    // pointersAndDynamicMemory();
    return 0;
}

void basicPointerOperations()
{
    int value = 10;
    int *ptr = &value; // ptr 是指向变量 value 的指针变量,对,也是个变量

    printf("value = %d\n",value);                   // 变量value的值
    printf("(void*)&value = %p\n",(void*)&value);   // 变量value的地址
    printf("(void*)ptr = %p\n",(void*)ptr);         // 指针变量ptr的值
    printf("(void*)&ptr = %p\n",(void*)&ptr);       // 指针变量ptr的地址
    printf("*ptr = %d\n",*ptr);                     // 指针变量ptr解引用的值
    printf("(void*)&*ptr = %p\n",(void*)&*ptr);     // 指针变量ptr解引用的地址

    /*
        总结:
        1. ptr的值是value的地址
        2. *ptr的值是value的值,*ptr的地址是value的地址,即*ptr就是变量value
        3. 不用关注ptr的地址,只需关注上述两条,即ptr的值和*ptr本身所代表的,value也可以没有(下面有关于指针访问参与内存分配的内容),因为实际访问操纵的是一块内存区域,*ptr和value都只是用于表示这块内存区域的变量,ptr也是,不过是另一块内存区域,存了指向的那块区域的地址
        |-------------|             |-------------|
     ptr|-val address-|     val/*ptr|-----10------|
        |-------------|             |-------------|
    */

}

void pointerAndArray()
{
    int array[3] = {10, 20, 30};
    int *array_ptr = array; // 指向数组的第一个元素

    printf("First element: %d\n", *array_ptr);    // 输出第一个元素
    printf("Second element: %d\n", *(array_ptr + 1)); // 输出第二个元素
    printf("Third element: %d\n", *(array_ptr + 2));  // 输出第三个元素
}

void pointerAndFunction()
{
    int value = 10;
    addOne(&value); // 将 value 的地址传递给函数
    printf("Value after addOne: %d\n", value); // 输出增加之后的值
}

void addOne(int *p) {
    (*p)++; // 增加解引用即value的值
}

void pointersAndDynamicMemory()
{
    int *ptr = (int*)malloc(sizeof(int)); // 动态分配一个 int 大小的内存
    if (ptr == NULL) {
        printf("Memory allocation failed\n");
        return -1;
    }

    *ptr = 10; // 在分配的内存中存储值
    printf("Value of dynamically allocated memory: %d\n", *ptr);

    free(ptr); // 释放内存
}
  • 21
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值