1、关键字
signed 有符号的 有 负数
unsigned 无符号的 没有 负数 最小值是 0
取值范围不一样 signed int i = -10;
不同的数据类型,所占据的 字节数 不一样, int long char double
signed int a = -10;
unsigned int b = -8;
long c = 1233445L;
cout<< sizeof(a) << endl;
cout<< sizeof(b) << " "<< b << endl;
cout<< sizeof(c) << " "<< c << endl;
结果:
4
4 4294967288
8 1233445
**所以,b的值是错误的。 声明变量的时候,默认是 signed 有符号的在修饰 **
上面的 表格 需要根据实际的系统 来确定(16 位(早期) 32 位 64位)。以前的long 是4字节,现在的是 8 字节
int32_t: 4个字节的 int
int64_t:8个字节的 int 只是取值范围不一样,为了就是内存的分配而神明的
这两个并不是基本数据类型,而是 C 中重新定义的 一个数据类型
建议使用这种方式,因为无论在 32位的系统还是64位的系统,都规定了他的数据范围,以便我们使用不同的系统,最后取值的时候,出问题
2、printf("%d/n") %d 是占位符。%s %f 等
类似于 java 中的 String.format() 中的用法 第一个中的图片后面有占位符
3、数组与 内存布局
C 中的 数组定义 必须声明长度,或者 复制
// sprintf 方法就是把后面的 字符串 复值给数据, char数组可以当 string 来用
char str[100];
for (int i = 0; i < 4; i++)
{
sprintf(str, "hello majie %d is num.", i);
printf("%s\n", str);
}
// C++ 中的 string 的使用与 java 类似
string text = "ertyui";
text.append(" majie");
printf("%s %d\n", text.c_str(), text.length());
int a[10]; // 如果int 是 4 字节, 这个数据大小就是 40 基本数据类型,存放在 栈区。栈的大小 大概 1M / 2M。不同的系统不一样
在linux系统下,使用ulimt -a 命令可以查看 栈的大小。当数据占用过高,数组声明的大小过大的时候,会出现stackOverFlow 的错误,也就是 栈内存溢出了
因为数组声明的时候需要指定大小,也就是会分配内存。 数组声明的过大,即使没有数据也会造成 stackOverFlow 的错误。
动态申请内存,在堆中 方法 malloc calloc realloc
因为栈的大小有限,但是在程序运行期间往往会需要一块较大的内存。所以这时候需要把内存声明在 堆 中。
malloc 方法 返回的是 void * 的类型,也就是任何的数据类型的指针
size_t size = 1 * 1024 * 1024;
// 在堆中 申请 1M 的内存
int *j = (int *) malloc(size);
// 初始化申请的内存中的数据 数据是 0 长度是 size
/**
* 为什么需要调用 memset 方法,对申请的内存地址进行初始化呢?
* 答案: 为我们申请的这块内存地址,可能是 重复使用的 内存。
* 里面已经有别的数据,在我们使用的时候容易出现错误。
* 所以,我们一般都紧接着调用 memset 初始化
* */
memset(j, 0, size);
// 对 malloc 申请的内存进行扩容
realloc(j, size * 2);
// 使用完 之后,必须记得释放
free(j);
// calloc 申请内存,并将内存初始化 为 0 第一个参数为大小,第二个参数是需要使用的 类型sizeof
int *jj = (int *) calloc(10, sizeof(int)); // 10 * 4 因为sizeof(int)=4
free(jj);
// alloca() 对栈中进行申请内存,一般不使用
4、在内存中的结构是什么样的?
内存布局解释.jpg堆中的内存分配是从低地址 往 高地址 进行分配的。分配的方式有两种,(也就是 malloc 的内部调用有两种)
1、当分配的内存小于我们配置的某个值(128K)的时候,使用 brk 的方式来申请
从低地址往高地址顺序的申请一块内存。当低地址有内存释放的时候,他的位置会移动
2、当需要分配的内存大的时候,使用 mmap 来申请
找一块满足大小的内存
5、.h 文件用来声明类,.c 文件用来实现方法
java 中 使用 import 进行 依赖,但是 依赖的对象 的 依赖 是无法使用的。 也就是无法进行传递 引入
c 中使用 include 进行的依赖,是可以进行传递的,也就是说,include 引入的 引入,可以直接使用
include 使用 引号 来引入,表示 查找相对路径, 使用<>来表示 查找我们配置的目录,和系统默认目录
网友评论