第一节:

上一个笔记

有趣的恶搞小程序

定时关机

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
//创建一个字符数组用于接收字符串
char input[20] = { 0 };
//使用system()执行定时关机的dos命令 命令库:#include <stdlib.h>
system("shutdown -s -t 60");
again://跳到了这里
printf("请输入我是猪,不然就关你电脑\n");
scanf("%s", &input);//给input赋值
if (strcmp(input, "我是猪")==0)//判断input数组是否为"我是猪" 命令库:#include <string.h>
{
//如果是,则取消
system("shutdown -a");
}
else {
//goto 可跳到对应代码段
goto again;
}
return 0;
}

给两个数,返回最大值

int main() {
printf("%d", checkNum(6, 2));
return 0;
}
int checkNum(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}

其他操作符

- 负数
+ 正数
& 取地址
sizeof 取类型长度(字节)
~ 取反按二进制位取反
解释:
int a = 2; //00000000000000000000000000000010
int b = ~a;//11111111111111111111111111111101
//~的解释为 按二进制位取反
// 过程:
//第一位为1 则是负数 0为正数
//原码,反码,补码
//在printf 中打印的是原码 而~所得的是补码
//补码二进制减一得到反码
//11111111111111111111111111111100
//补码第一位不变,其他取反则为原码
//10000000000000000000000000000011
//此时输出-3
printf("%d", b); -- 省略 x=x-1
++ x=x+1

int main() {
int a = 10;
int b = a++;
printf("a= %d b= %d", a, b);
return 0;
} 这里后置位++ 所以先使用再加减
反之如此 * 与上面取地址操作符是一对 (类型)xxx 强制转换
int c = (int)3.14; //3
printf("%d\n", c);

原码反码和补码

概念

在电脑中,只要是整数,在内存中存储的都是二进制的补码

正数:

原码,反码,补码相同

负数:

原码)

直接按照正负写出的二进制序列

反码)

原码符号位不变,其他按位取反得到反码

补码)

反码+1得到补码

比如说-3

源码:

1000000000000000000000000000011

反码

1111111111111111111111111111100

补码

1111111111111111111111111111101

常见关键字

auto 局部变量省略的关键字

break 停止循环 或者 跳出case

case 选择switch

char 字符

const 常量

continue 跳过本次循环

default switch 的默认

do while 先做再循环

    do{
先做的方法块
}
while(循环条件);

double 双精度浮点

else 否则

enum 枚举

extern 引入外部符号

float 单精度

for 循环

goto 跳转到某行

if 如果

int 整数型

long 长整数

register 寄存器关键字

  • 计算机存储数据:

    1. 寄存器
    2. 高速缓存
    3. 内存
    4. 硬盘
  • cpu的速度越来越快,但是内存的访问速度跟不上
  • so-> cpu想要处理数据,取寄存器,高速缓存中拿
  • 拿数据的过程:
    • 内存->高速缓存->寄存器->cpu
	//如果使用量大,每次都要去内存中拿,所以效率会不理想
//int a = 10;
//接下来
//把a定义为一个寄存器变量
register int a = 10;

return 返回

short 短整型

signed 声明有符号数

	//int a = 10;
//a = -2;
//int是有符号的
//所以定义时将signed省略掉了 完整的声明
int signed a = 10;

unsigned 无符号数 这个数字永远都是一个正数

sizeof 计算类型大小

static 静态 :

  • 修饰的变量 生命周期会变长
  • static 修饰全局变量 会改变变量的作用域-让静态的全局变量只能在自己所在的源文件内部使用 方法也一样
  • 实现原理类似于 java 的 private 和 public

struct 结构体 简易的对象

switch 选择

typedef 类型定义 类型重定义 也可以叫起别名

	typedef unsigned int u_int; //定义一个无符号数的整数类型为u_int
u_int a = 10;//声明一个u_int类型的变量

union 联合体 公用体

void

volatile 不被优化的

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存

while 循环

循环十次:

	int b = 0;
while (b<10) {
b++;
}

补充

关键字是不能和变量名冲突的

#define 定义常量和宏

定义常量:

#define MAX 100
int main() {
int a = MAX;
printf("%d", a);
return 0;
}

定义宏

#define MAX(X,Y) (X>Y?X:Y)

	printf("%d\n", MAX(10, 20));

指针

内存

c语言操作地址指针方法:

	int a = 10;
//输出对应地址
printf("%p\n", &a); int* p = &a;
//输出被赋值的p指针变量
//与上面&a相同
printf("%p\n", p);
int main() {
//首先把a变量存放到地址中,存放10
int a = 10;
//取到a变量的地址 赋值给指针变量
int* p = &a;
//通过*p 解引用 直接指向指针对应的地址 然后修改里面的数值为20
//此时a存放的值就变成了20
*p = 20;
//打印出来
printf("%d\n", a);
return 0;
}

指针内存的大小

指针大小:

32位机器 32个bit位序列

也就是4个字节

64位 则为64个bit

8个字节

vs2019 可在这里修改平台的位数

结构体

类似于java的类

*取到结构体指针

可以通过->属性名得到属性值

#include <stdio.h>
struct Book {
int bookId;
char name[];
};
int main() {
//printf("%s", "我是你爹"); //首先创建一个结构体 给俩属性赋值
struct Book book1 = { 1,"钢铁是怎样炼成的" }; //通过结构体变量.属性名称点出来对应属性值
printf("书编号:%d,书面:%s\n", book1.bookId, book1.name); //创建一个结构体指针变量
struct Book* pb = &book1;
printf("%p\n", pb); //通过(*结构体指针变量).属性名 得到对应属性
printf("书编号:%d,书面:%s\n", (*pb).bookId, (*pb).name); //通过结构体指针变量->属性名 得到对应属性
printf("书编号:%d,书面:%s\n", pb->bookId, pb->name); return 0;
}

补充

在c中,数组的本质是个地址

所以pb->name=xxx代码是不行的,我们可以这样修改name

#include <string.h>

	//此方法可以修改char数组
strcpy(pb->name, "骆驼祥子");

C语言日记② 初识 C的内存的更多相关文章

  1. C语言日记① 初识C

    概念 c语言是一种计算机语言 也就是人与计算机打交道的语言 在早期,因为计算机使用的二进制 所以早期写代码都是科学家来写的使用对应的功能二进制代码 需要用到手册,所以开发不方便 在后来,人们发明了汇编 ...

  2. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  3. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  4. C语言可以分配的最大内存

    前言 最近用C刷PAT算法题目, 发现C语言有太多需要关注大小范围的东西必须 知道, 虽说挺麻烦, 但也挺有意思. int最大值是多少 首先就是int类型的取值范围, 这个太常用. C语言标准规定最低 ...

  5. c语言类型修饰符及内存

    今天来学习一下c语言类型修饰符及内存分布 1.auto int a; 默认在内存 2.register int a; 限制变量定义在寄存器上的修饰符 编译器会尽量安排CPU的寄存器去存放这个a,如果寄 ...

  6. C语言中储存类别和内存管理

    C语言中储存类别和内存管理 储存类别 C语言提供了多种储存类别供我们使用,并且对应的有对应的内存管理策略,在了解C中的储存类型前,我们先了解一下与储存类型相关的一些概念. 1. 基础概念 对象:不同于 ...

  7. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...

  8. C语言中的指针和内存泄漏

    引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...

  9. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】06-变量与内存

    在前面一节中简单介绍了变量的使用,当我们定义一个变量的时候,系统就会为变量分配一块存储空间.而变量的数值在内存中是以二进制的形式存储的,这讲来深入研究变量在内存中的一些存储细节. 一.字节和地址 为了 ...

随机推荐

  1. 多台服务器共享session问题(2)

    多台服务器共享session问题  转载自:https://www.cnblogs.com/lingshao/p/5580287.html 在现在的大型网站中,如何实现多台服务器中的session数据 ...

  2. CPF 入门教程 - 各个控件介绍(八)

    CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...

  3. 写webpack插件报警告Tapable.plugin is deprecated. Use new API on .hooks instead解决方案,webpack4插件新写法

    最近写了个小插件报了个警告,然后去百度了一下,全都给我说extract-text-webpack-plugin这个插件有问题要更新,我也是无语了,这个插件我用都没用,百度翻了下齐刷刷全是这个答案,搞得 ...

  4. forEachRemaining

    ArrayList<Integer> arrayList=new ArrayList<>(); for (int i = 0; i <10; i++) { arrayLi ...

  5. 如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)

    亲测有效的更改RHEL7或CentOS 7的网卡名称的方法, 按照以下4步来操作就可以实现! Step 1 :网卡配置文件名称重命名为eth0[root@localhost ~]# ifconfige ...

  6. 性能测试工具JMeter 基础(九)—— 测试元件: 逻辑控制器之交替控制器

    交替控制器:根据被控制器触发执行次数,去依次执行控制器下的子节点(逻辑控制器.采样器),可以由线程组的线程数.循环次数.逻辑控制器触发. 交替控制器(lnterleave Controller) 简单 ...

  7. eBPF 安全项目 Tracee 初探

    1. Tracee 介绍 1.1 Tracee 介绍 Tracee 是一个用 于 Linux 的运行时安全和取证工具.它使用 Linux eBPF 技术在运行时跟踪系统和应用程序,并分析收集的事件以检 ...

  8. gohbase使用文档

    目录 1. 建立连接 2. 创建表 3. 插入记录 4. 删除记录 5. 查询记录 5.1 根据RowKey查询 5.2 scan范围查询 5.3 复杂查询(过滤器的使用) 5.3.1 比较过滤器 5 ...

  9. 痞子衡嵌入式:原来i.MXRT1xxx系列里也暗藏了Product ID寄存器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx系列里暗藏的Product ID寄存器. MCU 厂商在定义一个产品系列时,通常是会预先规划产品发展路线的(即会有一 ...

  10. K8s 开始

    Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统.本文将介绍如何快速开始 K8s 的使用. 了解 K8s Kubernetes / Overview 搭建 K8s 本地开发测试 ...