美文网首页
C语言入门(一)

C语言入门(一)

作者: 壹元伍角叁分 | 来源:发表于2022-04-24 16:12 被阅读0次

    1、c语言代码结构
    c文件以.c结尾。

    #include <stdio.h> // 导入标准库,C99标准库
    // <>代表寻找系统的资源
    // ''代表寻找我们自己写的资源
    // .h结尾代表声明c语言头文件, .hpp结尾代表声明c++语言头文件
    // .c结尾代表实现c语言文件,   .cpp结尾代表实现c++语言文件
    int main() {
        printf("哈哈 Hello, World!");
    
    //    getchar(); // getchar()会阻塞,使程序一直处于运行状态
        return 0;
    }
    

    多个类不能有多个main方法,运行会报错。

    FAILED: CProject 
    : && /Library/Developer/CommandLineTools/usr/bin/cc -g -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.3.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/CProject.dir/T1.c.o CMakeFiles/CProject.dir/T2.c.o -o CProject   && :
    duplicate symbol '_main' in:
        CMakeFiles/CProject.dir/T1.c.o
        CMakeFiles/CProject.dir/T2.c.o
    ld: 1 duplicate symbol for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    ninja: build stopped: subcommand failed.
    

    2、基本数据类型占位
    C语言中不能直接打印,需要使用占位。

    int main() {
        int i = 10;
        double d = 10;
        float f = 10;
        long l = 10;
        short s = 10;
        char c = '1';
        
        // 字符串 用 char * 表示
        char *str = "字符串";
        
        // printf(i); // 直接写的话,是不会打印的。
        
        // 需要通过占位。
        // int long short 可以直接通过 %d 占位
        printf("打印的是int %d\n", i);
        printf("打印的是long %d\n", l);
        printf("打印的是short %d\n", s);
    
        // double 通过 %lf 占位(相当于long float),float 通过 %f 占位
        printf("打印的是double %lf\n", d);
        printf("打印的是float %f\n", f);
    
        // char 通过 %c 占位
        printf("打印的是char %c\n", c);
    
        // str 通过 %s 占位
        printf("打印的是string %s\n", str);
    }
    

    3、基本数据类型占用的字节数

    int main() {
        // sizeof可以获取字节数
        printf("int占字节数 %d\n", sizeof(int));
        printf("long占字节数 %d\n", sizeof(long));
        printf("short占字节数 %d\n", sizeof(short));
        printf("double占字节数 %d\n", sizeof(double));
        printf("float占字节数 %d\n", sizeof(float));
    
        printf("char占字节数 %d\n", sizeof(char));
    
        //int占字节数 4
        //long占字节数 8
        //short占字节数 2
        //double占字节数 8
        //float占字节数 4
        //char占字节数 1
        return NULL;
    }
    

    4、在 C、C++ 语言中,万物皆指针( 指针 = 地址 )

    int main() {
        // 万物皆地址
        int i = 1000;
        // 地址用占位符 %p 占位。 在对象前面加 & 表示,取出对象的内存地址
        printf("打印int 1000的地址 %p\n", &i); // 结果:打印int 1000的内存地址 0x7ff7bb35f43c,每次打印的地址不一样,由c/c++分配
        int num_int = 1000;
        double num_double = 2000;
        printf("直接获取值 num_int=%d\n", num_int);
        printf("直接获取值 num_double=%lf\n", num_double);
    
        // &num_int 取出num_int的内存地址,
        // 在内存地址前面加*,代表取出内存地址上对应的值
        // *&num_int 取出&num_int这个内存地址上对应的值
        printf("通过地址获取值 num_int=%d\n", *&num_int);
        printf("通过地址获取值 num_double=%lf\n", *&num_double);
    
        // 这里不是定义一个int对象,而是定义一个int *对象(int类型的内存地址对象)。
        int *num2_intP = &num_int;
        double *num2_doubleP = &num_double;
        // 在内存地址前加*,取出值
        printf("num2_int=%d\n", *num2_intP);
        printf("num2_double=%lf\n", *num2_doubleP);
    
        // 内存地址变量、内存地址别名、指针、指针变量、指针别名...分别指啥?
        // 以 int *num2_intP = &num_int; 为例,
        // 内存地址 == 指针,int *
        // 指针别名 == 指针变量(指针的变量),num2_intP
    }
    

    5、通过指针去修改值

    int main() {
        int i = 100;
        // 1、直接修改
        i = 200;
        printf("i的是值是%d\n", i);
    
        // 2、通过指针修改
        int *ip = &i; // ip就是i的内存地址
        *ip = 300; // 取出i内存地址上的值,然后把300赋值给它。
        printf("i的是值是%d\n", i);
    }
    

    6、函数声明的位置

    // 2、必须定义在main方法之前
    void change2(int i) {
    
    }
    
    // 3-1、如果还想定义在main方法之后,那必须在main方法之前声明,然后在后面实现
    void change3(int i);
    
    int main() {
        int i = 1000;
    
    //    change(i);
        change2(i);
        change3(i);
    }
    
    // 1、会报错,不能在main方法后面声明。
    //void change(int i){
    //
    //}
    
    // 3-2:在后面实现
    void change3(int i) {
    }
    

    7、函数变量的传递

    void change(int i) {
        printf("change 改变前,i的值是 %d,i的地址是%p\n", i, &i);
        i = 2000;
        printf("change 改变后,i的值是 %d,i的地址是%p\n", i, &i);
    }
    
    int main() {
        int i = 1000;
        printf("main 调用change前,i的值是%d,i的地址是%p\n", i, &i);
        change(i);
        printf("main 调用change后,i的值是%d,i的地址是%p\n", i, &i);
    }
    

    打印结果:

    main 调用change前,i的值是1000,i的地址是0x7ff7b7d6b43c
    change 改变前,i的值是 1000,i的地址是0x7ff7b7d6b41c
    change 改变后,i的值是 2000,i的地址是0x7ff7b7d6b41c
    main 调用change后,i的值是1000,i的地址是0x7ff7b7d6b43c
    

    可以看到,main方法中的i和change方法中的i的地址是不一样的。
    这说明在调用change方法后,c编辑器相当于是复制了一份i,这也就解释了在change方法中改变了i的值,并不会影响main方法中的i值.

    那我们要怎么实现改变同一个变量的值呢?

    声明不允许函数重载,所以改个函数名
    void change2(int *pInt) {
        printf("change2 改变前,i的值是 %d,i的地址是%p\n", *pInt, pInt);
        // 改变内存地址上的值。
        *pInt = 2000;
        printf("change2 改变后,i的值是 %d,i的地址是%p\n", *pInt, pInt);
    }
    
    int main() {
        int i = 1000;
        printf("main 调用change2前,i的值是%d,i的地址是%p\n", i, &i);
        // 传递i的内存地址
        change2(&i);
        printf("main 调用change2后,i的值是%d,i的地址是%p\n", i, &i);
    }
    

    打印结果:

    main 调用change2前,i的值是1000,i的地址是0x7ff7b84a143c
    change2 改变前,i的值是 1000,i的地址是0x7ff7b84a143c
    change2 改变后,i的值是 2000,i的地址是0x7ff7b84a143c
    main 调用change2后,i的值是2000,i的地址是0x7ff7b84a143c
    

    可以看到,main方法中的i和change方法中的i的地址是一样的了。
    在change2方法中,改变了同一地址的值后,main方法中的i值也随之改变。

    两个值得互换

    void change3(int *ip, int *jp);
    
    // 两个值互换
    int main() {
        int i = 10;
        int j = 20;
        // 传入i和j的内存地址
        change3(&i, &j);
    }
    
    void change3(int *ip, int *jp) {
        printf("change3前,i的值%d%,j的值%d,i的地址%p,j的地址%p\n", *ip, *jp, ip, jp);
        int tempI = *ip; // 定义一个临时的变量,用来记录i的值。
        *ip = *jp; // 将ip地址上的值修改成jp地址上的值。
        *jp = tempI; // 将jp地址上的值修改成ip地址上之前的值。
        printf("change3后,i的值%d,j的值%d,i的地址%p,j的地址%p\n", *ip, *jp, ip, jp);
    }
    

    打印结果:

    change3前,i的值10,j的值20,i的地址0x7ff7b2e2a43c,j的地址0x7ff7b2e2a438
    change3后,i的值20,j的值10,i的地址0x7ff7b2e2a43c,j的地址0x7ff7b2e2a438
    

    可以看到i和j的地址都没有改变,值实现了互换。

    相关文章

      网友评论

          本文标题:C语言入门(一)

          本文链接:https://www.haomeiwen.com/subject/qqityrtx.html