“初识C语言“ (part 3)

只要你愿意 开始总比放弃好。     Roman.

愿我们都有自己的目标并正在为其不懈努力。

最近学习的小结 算是给愿意重新的自己的一种交代 告别2021.

十二、指针

 一)内存

 1、为了更好地管理内存,将内存划分为一个个小的内存单元,每个内存单元大小是1byte

  •  不使用bit作为内存单元大小是因为其太小,太浪费内存,如简单的char类型是1byte,这将会浪费8bit,即8个内存单元
  • 给每个内存单元进行了编号,编号即为内存单元地址

  2、如何进行编号?

   依据位数进行编号

     ①如:32位机器其有(2^32)种排列方式,即其编号最大数为(2^32)

   所以,有最大空间(2^32)byte,依次除以1024可以得到其内存空间大小4GB(1024是相邻两单位间的换算关系);如此就可求得64位机器的内存

   ②同样,再以32位机器为例,其每一位都有0/1两种可能,故才有了(2^32)种排列方式,即编号最大数

   ③32位,即为32根地址线/数据线

    地址线:类似于电线,通电后电线号可以转换成数字信号1/0(高低电平)

   其范围:00000000000000000000000000000000(32位)

                ......

                 11111111111111111111111111111111(32位)

   二进制表示时长度太长,故换用十六进制表示--8位十六进制数字即可表示32位二进制

    如:0x00000000   0xFFFFFF    (其中 0x 是十六进制的标志前缀)

  •   将其转换为十进制后的值即为地址编号

   3、当变量占多个字节时,只关注变量的起始地址就可

     %p是打印地址的,如:printf("%p\n",&a) 最后打印结果是a的首地址

 二)指针变量

  1、内存单元都有编号,这个编号就是地址,把该地址叫做指针!

  2、 int  * pa=&a;

 用pa来存放a的地址,类型是 int  *   (int* 是因为a的类型是int,当a的类型改变时int也随之改变)

  ①将pa 叫做指针变量

  ②* 的意义:pa 是一个指针变量

  ③int 告诉我们:pa指向的对象是int 类型的

  3、*pa   pa是指针变量,*是解引用操作符

  它的意思是:通过pa 中存放的地址找到 pa指向的内容:如 *pa ='a' ; 则代表 pa指向的内容被修改为a

  4、指针变量的大小:大小固定为4byte!(32位机器)

   因为指针变量即地址,地址32位即32bite=4byte; 当然,如果64位机器,则64bit=8byte大小!

 三)结构体

  struct 是C语言自定义数据类型 不是内置数据类型

  1、C语言想要描述复杂类型   如:描述学生:名字、年龄、性别、学号等

   1)//结构体类型--相当于图纸

     struct  Stu

     {

       //名字--字符串  用数组表示字符串!

      char name[20];

     //年龄--整数

     int age;

    //性别--字符串

    char sex[5];

    //学号--字符串

    char id[20];

   };

写在main 函数外面!

   

 2)在main函数中调用

  //结构体变量--相当于房子,真正存储

  struct Stu s1={"张三",18,"女","20203101218"};   //初始化

  //直接打印

  printf("%s %d %s %s\n",s1.name,s1.age,s1.sex,s1.id);

  //函数打印

  主函数内:Print(&s1);

  主函数外写出函数:

  void Print(struct Stu * ps)

 {

 //printf("%s %d %s %s\n",((*ps).name,(*ps).age,(*ps).sex,(*ps).id);

  printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id);

  • 补充输入

   //输入

   scanf("%s %d %s %s\n,s1.name,&(s1.age),s1.sex,s1.id);

   //注意:此时是 变量.    然后注意数组名即地址,不需要加&,但是int 要加&

 }

 3)注意:指针变量解引用后.

                (地址)指针变量->

 4)可以给结构体类型重定义名称,便于后续使用

   如: typedef struct Stu

          {

         }stu;

      之后使用时就可以将 typedef struct Stu 全部改为stu
  2、struct是结构体关键字

  3、结构体指针->结构体成员

        结构体变量.结构体成员

    (结果欧成员访问操作符  .  ->)

十三、编译器

 1、GCC

 2、MSVC:如VS2019集成开发环境

   工具--选项:可以修改字体颜色等

   调试:f10

十四、C语言程序

 写代码(以VS2019为例):

 1)编译器

 2)新项目/空项目:

  ①项目名称不要汉字

 ②不要加特殊字符

 ③不要空格

 ④注意修改存储位置(可以新建文件夹等)

 ⑤视图--解决方案资源管理器

 3).c  源文件      .h 头文件         .cpp(C++源文件)

 4)代码

  ①VS2019 首先要在源文件中写入: #define _CRT_SECURE_NO_WARNINGS 1

  •    VS认为C语言提供的scanf存在安全问题,用scanf_s 可以解决,但是不具有普适性,所以最好是在源文件加入上述语句,继续用scanf
  • VS中新建的源文件都是拷贝newc++file.cpp 文件的,故找到该文件并拷贝至桌面,输入以上后再按原路径替换即可永久保持,一打开就存在

 ②主函数 

     int main()

    {     

      return 0;

  }

  •  int 整型 与后面return 的0 相对应
  • 主函数只有一个
  • 在同一个项目下 即使多个源文件存在,但是只能有一个主函数!
  • 主函数是程序入口!

 ③printf 打印函数:在函数中需要 #include<stdio.h>  

   std i o :标准输入输出函数

 ④scanf 输入函数

  •  数组输入无& 直接输入数组名就行(数组名即地址)
  • scanf 不关心输入字符串长度是否溢出,故其不安全

  5)编译 链接 运行:ctrl+f5  or  ctrl+fn+f5

十五、计算机单位

 bit   byte   kb   mb   gb   tb   pb

 1 byte=8 bit    除外,相邻两个单位间的换算关系都是1024

十六、补充内容

  多组输入: while(scanf()!=EOF) {  }

  •  scanf函数调用失败时,返回 EOF
  • EOF 文件结束  其本质是 -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值