C语言从入门到入土(入门篇P3)

Posted 原来45

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言从入门到入土(入门篇P3)相关的知识,希望对你有一定的参考价值。

初识C语言

  1. 什么是C语言
  2. 第一个C语言程序
  3. 数据类型
  4. 变量、常量
  5. 字符串+转义字符+注释
  6. 选择语句
  7. 循环语句
  8. 函数
  9. 数组
  10. 操作符
  11. 常见关键字

//以上是前两节的内容,想看的小伙伴们可以去我的主页哈! 

目录

初识C语言

 11.2 关键字static

11.2.1 修饰局部变量

11.2.2 修饰全局变量

11.2.3 修饰函数

12. #define 定义常量和宏

13. 指针

13.1 内存

13.2 指针变量的大小

14. 结构体


11.1 关键字 typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。

比如:

        

上述两个式子是一样的哈!

 11.2 关键字static

C 语言中:
static 是用来修饰:
1. 修饰局部变量
2. 修饰全局变量
3. 修饰函数

11.2.1 修饰局部变量

// 代码 1
#include <stdio.h>
void test ()
{
    int i = 0;
    i ++ ;
    printf ( "%d ", i);       
}
int main ()
{
int i = 0 ;
    for ( i = 0 ; i < 10 ; i ++ )
  {
        test ();
  }
    return 0 ;
}

// 代码 2
#include <stdio.h>
void test ()
{
    //static 修饰局部变量
    static int i = 0 ;
    i ++ ;
    printf ( "%d " , i );
}
int main ()
{
int i = 0 ;
    for ( i = 0 ; i < 10 ; i ++ )
  {
        test ();
  }
    return 0 ;
}

 即第一次使用后后面就没有再用了

这里就再牵扯到内存了(先简单提一下):

 

(其中只是举了些例子,并不是这有这些,而且也不止是只有这三个区,只是主要是这三个哈!)

      

程序从test.c到test.exe的过程

对于上图:告诉我们static在修饰局部变量的时候是在编译就完成了的,即在程序运行之前。

 对比代码1和代码2的效果理解static修饰局部变量的意义。

结论:
static 修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

11.2.2 修饰全局变量

// 代码 1
//add.c
int g_val = 2018 ;
//test.c
int main ()
{
    printf ( "%d\\n" , g_val );
    return 0 ;
}
// 代码 2
//add.c
static int g_val = 2018 ;
//test.c
int main ()
{
    printf ( "%d\\n" , g_val );
    return 0 ;
}
//上述的add.c 和test.c是指两个不同的源文件
代码 1 正常,代码 2 在编译的时候会出现连接性错误。
结论:
一个全局变量被 static 修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。
这里就要再提到 extern 这个关键字,再使用不同源文件的内容的时候,要在想使用另一个源文件内容的源文件里面进行声明(如下用extern),但是如果另一个源文件那个想要使用的内容被static修饰的话,就算声明也是没有用的(即不能使用)。(如下图)

 PS(static修饰全局变量):

1.生命周期还是不变储存位置不变,因为还是在静态区, 只是 从全局变量变为了静态变量(都在静态区)

2.静态变量只能在自己的源文件内部使用  

11.2.3 修饰函数

//static修饰函数与修饰全局变量是相似的

// 代码 1
//add.c
int Add ( int x , int y )
{
    return c + y ;
}
//test.c
int main ()
{
    printf ( "%d\\n" , Add ( 2 , 3 ));
    return 0 ;
}        
// 代码 2
//add.c
static int Add ( int x , int y )
{
    return c + y ;
}
//test.c
int main ()
{
    printf ( "%d\\n" , Add ( 2 , 3 ));
    return 0 ;
}
代码 1 正常,代码 2 在编译的时候会出现连接性错误.
结论:
一个函数被 static 修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
剩余关键字后续课程中陆续会讲解

12. #define 定义常量和宏

        
//define 定义标识符常量
#define MAX 1000
//define 定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main ()
{
    int sum = ADD ( 2 , 3 );
    printf ( "sum = %d\\n" , sum );
   
    sum = 10 * ADD ( 2 , 3 );
    printf ( "sum = %d\\n" , sum );
   
    return 0 ;
}
     
与函数差不多,各有优缺点,后面会讲    

13. 指针

//对于指针,有很多人一听到就会怕,其实指针也没有那么恐怖,而且现在还是在"初识C语言"中,只会让大家对于这些东西有一个大体的了解,所以大家干就完了=。=!

13.1 内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是 1 个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该 内存单元的地

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:
#include <stdio.h>
int main ()
{
int num = 10 ;
& num ; // 取出 num 的地址
    // 注:这里 num 4 个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf ( "%p\\n" , & num ); // 打印地址, %p 是以地址的形式打印
return 0 ;
}
                
PS:
地址存放是16进制的

 

 那地址如何存储,需要定义指针变量。

int num = 10 ;
int * p ; //p 为一个整形指针变量
p = & num ;
指针的使用实例:
#include <stdio.h>
int main ()
{
int num = 10 ;
int * p = & num ;
* p = 20 ;
    return 0 ;
}

 //这里num本来是10,*p就是相当于num,即结果就是num等于20。

以整形指针举例,可以推广
#include <stdio.h>
int main ()
{
char ch = 'w' ;
char* pc = & ch ;
* pc = 'q' ;
printf ( "%c\\n" , ch );
    return 0 ;
}
//这里ch为原来的'w',改为了'q'。

PS:对于指针变量的用法 (存放地址是为了以后要用的时候通过p去访问a,或者改变a)

 我们把地址也称为指针   这个变量(如p)是用来存放地址的也是用来存放指针的所以也称为指针变量,当你在使用指针变量的时候其实是在使用里面的地址(如a)

总结:指针就是地址,地址也被称为指针,当指针(或地址)要被存起来的时候,这个变量就被称为指针变量,这个指针变量就是用来存放地址的(存放别人的地址)(在指针变量的眼里所有的东西都是地址,只要你把一个东西存进去,他就会把他当做地址)

13.2 指针变量的大小

#include <stdio.h>
// 指针变量的大小取决于地址的大小
//32 位平台下地址是 32 bit 位(即 4 个字节)
//64 位平台下地址是 64 bit 位(即 8 个字节)
int main ()
{
    printf ( "%d\\n" , sizeof ( char * ));
    printf ( "%d\\n" , sizeof ( short * ));
    printf ( "%d\\n" , sizeof ( int * ));
    printf ( "%d\\n" , sizeof ( double * ));
    return 0 ;
}
结论 :指针大小在 32 位平台是 4 个字节,64位平台是 8 个字节。
//这个大小就没啥好说的哈,大伙记住就行。

14. 结构体

结构体是 C 语言中特别重要的知识点,结构体使得 C 语言有能力描述复杂类型。
比如描述学生,学生包含: 名字 + 年龄 + 性别 + 学号 这几项信息。
这里只能使用结构体来描述了。
例如:
struct Stu
{
    char name [ 20 ]; // 名字
    int age ;       // 年龄
    char sex [ 5 ];   // 性别
    char id [ 15 ] // 学号
};
结构体的初始化:
// 打印结构体信息
struct Stu s = { " 张三 " 20 " " "20180101" };
//张三真惨,法律上是例子,结构体也是=。=
//. 为结构成员访问操作符
printf ( "name = %s age = %d sex = %s id = %s\\n" , s . name , s . age , s . sex , s . id );
//-> 操作符
struct Stu * ps = & s ;
printf ( "name = %s age = %d sex = %s id = %s\\n" , ps -> name , ps -> age , ps -> sex , ps -
> id );
(也是先让大家了解结构体哈!,不懂完全没有问题=。=!)
本章完!!!
接下来就会按照"初识C语言"中的内容逐个详解!!!
让大家更好地去体会C语言的魅力!!!
如果我的文章对大家有帮助的话,请来个点赞加关注吧!
当然要是有什么不对的地方,欢迎大家在评论区斧正!
让我们一起加油吧!!!!!
        
        

以上是关于C语言从入门到入土(入门篇P3)的主要内容,如果未能解决你的问题,请参考以下文章

C语言从入门到入土(入门篇)(数组p1)

C语言从入门到入土(入门特别篇)珠玑妙算益智小游戏

汉罗塔与青蛙跳台阶的递归实现(及扩展青蛙跳台阶)C语言从入门到入土(入门篇)(算法篇p2)

《C语言深度剖析》第三章 预处理详解 p2(完结) C语言从入门到入土(进阶篇)

《C语言深度剖析》第五章 内存管理 p1(完结)( C语言从入门到入土(进阶篇)

《C语言深度剖析》第四章 指针和数组 p2 C语言从入门到入土(进阶篇)