c与c++
C语言是一门通用计算机编程语言,广泛应用于底层开发。
c语句是面向过程的语言,c++是面向对象的语言,C++对c进行扩展。
c是c++的子集,c++是c的超集,所以大部c语言程序都可以不加修改的拿到c++下使用。
1、基本数据类型
1.signed----有符号,可修饰char、int。Int是默认有符号的。
2.unsigned-----无符号,修饰int 、char
整型 | 字节 | 取值范围 | 占位 |
---|---|---|---|
int | 4 | -2,147,483,648 到 2,147,483,647 | %d |
unsigned int | 4 | 0 到 4,294,967,295 | %u |
short | 2 | -32,768 到 32,767 | %hd |
unsigned short | 2 | 0 到 65,535 | %hu |
long | 4 | -2,147,483,648 到 2,147,483,647 | %ld |
unsigned long | 4 | 0 到 4,294,967,295 | %lu |
char | 1 | -128 到 127 | %c |
unsigned char | 1 | 0 到 255 | %c |
为了得到某个类型或某个变量在特定平台上的准确大小,使用 sizeof 运算符。
表达式 sizeof(type) 得到对象或类型的存储字节大小。
long int 其实就是长整型 = long 可以省去int
在标准中,规定 int至少和short一样长,long至少和int一样长。
为什么会存在long?
long和int在早期16位电脑时候 int 2字节,long 4字节,而计算机发展到现在,一般32、64下,long和int一样。和java类比的话,java的long就是 long long 8字节
格式化还有:
8进制 %o
16进制 小写: %x 大写:%X
(0x)+16进制前面 %#x
浮点型 | 字节 | 精度 | 占位 |
---|---|---|---|
float | 4 | 6位小数 | %f |
double | 8 | 15位小数 | %lf |
long double | 8 | 19位小数 | %Lf |
C99标准以前,C语言里面是没有bool,C++里面才有, C99标准里面定义了bool类型,需要引入头文件stdbool.h
bool类型有只有两个值:true =1 、false=0。 因此实际上bool就是一个int 所以在c/c++中 if 遵循一个规则, 非0为true,非空为true; NULL 其实也就是被define为了 0
2、格式化
include <stdio.h>
printf、sprintf等
sprintf:
将格式化的数据写入第一个参数
char str[100];
sprintf(str, "img/png_%d.png", 1);
printf("%s", str);
//使用 0 补到3个字符
sprintf(str, "img/png_%03d.png", 1);
printf("%s", str);</pre>
3、数组与内存布局
数组 : 连续的内存
//java
int[] a
//c
//必须声明时候确定大小
int a[10]
//或者 直接初始化
int a[] = {1,2,3}
//大小
printf("%d",sizeof(a)/sizeof(int));
栈内存限制 linux:ulimit -a 查看 但是直接分配这么大不行,因为堆栈可能保存参数,返回地址等等信息
动态内存申请
malloc 没有初始化内存的内容,一般调用函数memset来初始化这部分的内存空间.
calloc 申请内存并将初始化内存数据为NULL.
int *pn = (int*)calloc(10, sizeof(int));
realloc
对malloc申请的内存进行大小的调整.
char a = (char)malloc(10);
realloc(a,20);
特别的: alloca 在栈申请内存,因此无需释放. int *p = (int *)alloca(sizeof(int) * 10);
物理内存 物理内存指通过物理内存条而获得的内存空间
虚拟内存 一种内存管理技术 电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大,则会导致内存消耗殆尽。 虚拟内存技术还会匀出一部分硬盘空间来充当内存使用。
代码段: 存放程序执行代码(cpu要执行的指令)
栈是向低地址扩展数据结构 堆是向高地址扩展数据结构
进程分配内存主要由两个系统调用完成:brk和mmap 。
brk是将_edata(指带堆位置的指针)往高地址推;
mmap 找一块空闲的虚拟内存。
通过glibc (C标准库)中提供的malloc函数完成内存申请
malloc小于128k的内存,使用brk分配内存,将_edata往高地址推,大于128k则使用mmap