C语言学习日记6

  1、数据类型

  1.1 基本数据类型

    数据类型分2类:基本数据类型+复合类型

    基本类型:char short int long float double

    复合类型:数组 结构体 共用体 类(c++)

  1.1.1内存占用与sizeof运算符

    数据类型就好像一个个的模子,这个模子实例化出C语言的变量。变量存储在内存中,需要占用一定的内存空间。一个变量占用多少空间由变量的数据类型决定的。

    每种数据类型,在不同的机器平台上占用内存是不同的。我们一般讲的时候都是以32位CPU为默认的硬件平台来描述:

    char 1字节  short 2  int 4  long 8 float 4 double 8

  1.1.2 有符号数和无符号数

    对于char short int long 等整型类型的数,都分有符号数和无符号数。而对于float和double这种浮点型数来说,只有有符号数,没有无符号数。

  1.1.3 整型数和浮点型数存储方式上的不同  

    对于C语言来说,数(变量)是存储在内存中一个个的格子中的。存储的时候是以二进制方式存储的,对于有符号数和无符号数来说,存储方式是不同的。譬如对于int来说

    unsigned int无符号数,32位全部用来存数的内容,所以表示的数的范围是0-4294967295(2^32-1)

    int 有符号数,32位中最高位用来存符号(0表示正数,1表示负数),剩余的31位用来存数据。所以可以表示的范围-2^31 ~ 2^31-1

    结论:从绝对数值来说,无符号数所表示的范围要大一点。

    对于float和double这种浮点类型的数,它在内存中的存储方式和整型数不一样。所以float和int相比,虽然都是4个字节但是在内存中存储的方式完全不同。所以同一个4字节的内存,如果存储时是按照int存放的,取的时候一定要按照int型方式去取。

    总结:存取方式上主要有两种,一种是整型一种是浮点型,这两种存取方式完全不同,没有任何关联,所以是绝对不能随意改变一个变量的存取方式。在整型和浮点型之内,譬如说4中整型char、short、int、long只是范围大小不同而已,存储方式是一模一样的。float和double存储原理是相同的,方式上有差异,导致了能表示的浮点型的范围和精度不同。

  1.2 空类型(关键字void)

    C语言中的void类型,代表任意类型,而不是空的意思。任意类型的意思不是说想变成谁就变成谁,而是说它的类型是未知的,是还没指定的。

    void * 是void类型的指针。含义是:这是一个指针变量,该指针指向一个void类型的数。void类型的数就是说这个数有可能是int,有可能是float,也有可能是个结构体,那种类型都有可能,只是我当前不知道。

    void型指针的作用就是,程序不知道那个变量的类型,但是程序员自己心里知道。程序员如何知道?当时给这个变量赋值的时候是什么类型,现在取的时候就是什么类型。这些类型对不对,能否兼容,完全由程序员自己负责。编译器看到void就没办法帮你做类型检查了。

    在函数的参数列表和返回值中,void代表的含义是:一个函数形参列表为void,表示这个函数调用时不需要给它传参的。返回值类型是void,表示这个函数不会返回一个有意义的返回值。所以调用者也不要想着去使用该返回值。

C语言设计基本理念:

C语言相信程序员永远是对的,C语言相信程序员都是高手,C语言赋予了程序员最大的权利。所以C语言的程序员必须自己对程序的对错负责,必须随时脑袋清楚,知道自己在干嘛。

#include <stdio.h>

int main(void)
{
  int a = 444;
  void *pvoid;
  pvoid=&a;

  printf("*pvoid=%d.\n*pvoid=%f.\n",*(int *)pvoid,*(float *)pvoid);
  //在这里由于编译器不知道pvoid是什么类型的指针,所以我们在用的时候强制他用int *类型
  //第二个强制用float *,编译器是不会报错的,他不知道,但取出来是错的。
  return 0;
}

  1.3 数据类型的转换

  C语言中有各种数据类型,写程序时需要定义各种类型的变量,这些变量需要参与运算。C语言有一个基本要求就是:不同类型的变量是不能直接运算的。就是说,int和float类型的变量不能直接加减乘除,必须先把两种类型专程相同的类型才可以。

  1.3.1 隐式转换

  就是自动转换,是C语言默认会进行的,不用程序员干涉。

C语言理念:隐式类型转换默认朝精度更高、范围更大的方向转换。

  1.3.2 强制转换

  C语言默认不会这么做,但程序员我想这么做。

  1.4 C语言与bool类型(只有两个值0,1,就是真和假)

  C语言中原生类型没有bool,C++中有。在C语言中如果需要使用bool类型,可以用int来代替。

  2、变量和常量

  2.1、变量

  2.1.1、局部变量

  定义在函数内部的变量

  2.1.1.1、普通局部变量auto

  2.1.1.2、静态局部变量static

  2.1.1.3、寄存器局部变量register

      一般只在内核或者启动代码中,需要反复使用同一个变量这种情况下才会使用

  2.1.2、全局变量

  定义在函数外面的变量

  2.1.2.1、普通全局变量

  2.1.2.2、静态全局变量(屏蔽作用,单个源文件独用)

  2.1.2.3、跨文件引用全局变量extern

对比:

1、定义同时没有初始化,则局部变量的值是随机的,而全局变量的值默认为0。

2、使用范围上:全局变量具有文件作用域(文件范围内,定义位置之后有效),而局部变量只有代码块作用域。代码块就是用{}扩起来的一段代码。

3、变量的分配位置:全局变量分配在数据段上,而局部变量分配在栈上。

数据段:数据段存的是数,像全局变量就是存在数据段的。

代码段:存的是程序代码,一般是只读的。

栈stack:先进后出。C语言中局部变量就分配在栈中。程序运行时,局部变量放入栈中,各个局部变量和栈中的地址相关联就是局部变量的诞生,出了代码块,变量地址释放,变量就死了。

插一段LINUX GCC使用。

多文件C语言项目

1、简单的C语言程序只有一个C文件a.c,编译的时候gcc a.c -o a

2、复杂的C语言程序是由多个C文件构成的。譬如一个程序中有2个c文件,编译的时候gcc a.c b.c -o ab

时间: 2024-08-11 13:29:25

C语言学习日记6的相关文章

C语言学习日记 week1

作为一名业外人士,时光辗转已经从学校毕业两年半了,经历了工作.考研(失败).再找工作最终决定向一名程序员发展.虽说最近人工智能传的沸沸扬扬,未来要取代各种基础工作岗位(当然也包括程序员),但是我认为只要比机器人学的更深入就行了,如果学的不如机器人那做什么行业又不是一样是被取代呢?当然也是有很多行业职能是人工智能暂时难以触及的,不过很多对于我来说并不是很感冒,至少现在是的. 虽然报名学的Java,但是还未正式上课,老师先普及了一下C语言,为期两周,第一周已经结束了,同样也是在老师的建议下开通了这样

C语言学习日记3

昨天又偷懒了哎,简直没救了我. 今天魔兽首映!ohyeah!好期待啊~虽然好像爆出很多消息说其实是烂片. 1.函数应用:math.h int abs(int i)//求绝对值 long labs(long i)//求长整型绝对值 double fabs(double i)//实型绝对值 ps:常量后可加写 u,l,f 加以区别 double sin(double i)//正弦函数 double cos(double i)//余弦函数 double tan(double i)//正切函数 字符和字

C语言学习日记4

发现一个很好的学习视频,叫朱老师物联网大讲堂. 1.指针类型:在定义指针的时候 数据类型 *指针名 这个地方的数据类型,是指指针指向的变量的数据类型.必须匹配! 在定义的时候可以这么定义 int *pint; float *pfloat; char *pchar; double *pdouble; int *p; 理解方法,首先看到p,这个是变量名,其次,p前面有个*,说明这个变量p是个指针变量,最后,*p前面有个int,说明这个指针变量p所指向的是一个int型的数据.或者可以写成int* p:

C语言学习日记8

4.1.1 程序运行为什么需要内存? 4.1.1.1 计算机程序运行的目的. 4.1.1.2 计算机程序运行过程 4.1.1.3 冯诺依曼结构和哈佛结构 冯诺依曼结构是:数据和代码放在一起. 哈佛结构是:数据和代码分开存在. 什么是代码:函数 什么是数据:全局变量.局部变量. 4.1.1.4 动态内存DRAM和静态内存SRAM. 4.1.1.5 总结:为什么需要内存? 4.1.1.6 如何管理内存 从操作系统角度讲:操作系统掌握所有的内存,因为内存很大,所以操作系统把内存分为1个个的页面(一般是

C语言学习日记 week2 day1-2 方法 数组

一.方法(Method) java中的方法(Method)类似于C语言中的函数(function),都是一系列代码的集合,将一系列代码打包用以实现一个特定的功能就成为一个方法了: 1)方法的定义: [qualifier]   return value type     Method name        (datatype parameter,datatype parameter,,,,) [修饰符]           返回值类型                方法名            

C语言学习日记7

2.2 常量 程序运行过程中不会改变的量.初始化的时候给定. 2.2.1 #define 2.2.2 const const 修饰变量后,变量就变成常量了. const 和指针结合,共有4种形式 const int *p; p是一个指针,指针指向一个int型数据.p所指向的是个常量. int const *p; p是一个指针,指针指向一个int型数据.p所指向的是个常量. int *const p; p是一个指针,指针指向一个int型数据.p本身是个常量,p所指向的是个变量. const int

C语言学习日记5

又看了一遍超体,印象最深的是那个黑人上课的场景,真是我想象中的校园,一心学术. 1.结构体 没有结构体之前,在C语言中,数据的组织依靠:变量+数组.最简单的时候,只需要使用基本数据类型来定义单个变量,需要几个变量就定义几个.后来情况变复杂了,有事需要很多意义相关的变量,这时候数组出现了.数组解决了需要很多类型相同,意义相关的变量的问题. 但是数组是有限制的.数组最大的不足在于,一个数组只能存储很多个数据类型相同的变量.(譬如使用一个数据结构来保存一个学生的所有信息:姓名,学号,性别.) 什么是结

C语言学习日记2

昨天相亲好晚才回,又看了会视频,en...妹子挺漂亮的. 1.goto 语句(如goto flag1; flag1:),标识符和goto要在同一个函数中,上下无所谓. 2.“”是字符串,’‘是单个字符. 3.数组: 一维数组 数据类型  数组标识符[常量表达式] 二位数组 数据类型 数组标识符[常量表达式1][常量表达式2] 引用时 标识符[常量],下标从0开始,数组元素共引用时常量表达式的个数     a[3][4] 3行4列  a[0][0] a[0][1] a[0][2] a[0][3]

学习日记

五一耍了三天,自己的计划有泡汤,那种制止力哪里去了,不过我认真起来还有有废寝忘食的时候,不过希望这种时候多一点,回家妈妈告诉我,她给老师打电话了的,老师说了我的一些情况,不过我没有老师说的那么好,学习在班上算中等.我觉得还算不上吧!任重而道远吧. Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量