这周主要学习了指针:主要是想记录自己的慢慢成长!
1.指针也是变量,只是存储的值是一个地址 32位占4字节,64位占8字节
系统不允许我们访问0的地址
2.指针无法相加 同一数组 相减得出的数是它们相隔的数字数量,而不是相隔的数量乘以类型字符数
不同数组 相减得出的就是地址的差除以数据类型,其实就没有什么意义了,因为地址差并不固定
不同类型的指针无法加减
3.int* p;想指谁就指谁,想改谁就改谁
int const* p;可以指别人,但是不能改
int* const p;不能指别人,但是可以改
const int* const p;不能指,不能改
4.void型指针,存储了地址,但是无法访问地址的值;
如果想访问地址,就得做对应的强制类型转化
而其它类型指针可以隐式转换为void型,可以直接让无类型的指针指向有类型的地址
强制类型转换 char * p1 = (char *)p; p为void型指针、
5.int compare_char(const void *a, const void *b) 函数定义
int (*fp)(const void *, const void *) 定义函数指针
fp = &compare_in 函数指针指向函数的地址
(*fp)(&x, &y); 调用函数
fp(&x,&y); 调用函数
6.类型&name 定义别名 不能为没有定义的变量定义别名
引用可以定义多个,引用有自己的空间 引用就类似于常指针 int* const p = &a;
当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地
址,传给了形参引用(常量指针)
7.为了让程序更加的健壮,一个指针传入函数时,首先要判断是否是空指针
另外一些正负之类的问题有需要的时候也应该判断
8.
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等。
2、堆区(heap):一般由程序员分配释放,随叫随到,挥之即走。
3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
4、文字常量区:存放常量字符串。
5、程序代码区:存放函数体(包括类的成员函数、全局函数)的二进制代码
9.只有new分配内存,而不用delete释放 有可能会造成内存泄漏
new和delete是运算符不是函数,执行效率高
c语言malloc和free
动态内存分布对于防止栈区溢出很有帮助
10.静态变量只能在函数中使用,但是会永远存在
11.void *memcpy(void *dest, const void *src, size_t n);内存拷贝函数
功能:从源 src 所指的内存地址的起始位置开始拷贝 n 个字节到目标 dest 所指的
内存地址的起始位置中
12.常见错误
1)所申请的动态内存不要多次释放
2)忘记释放内存,造成内存泄漏
3)释放的地址不是申请时的地址
4)释放空指针
5)已经释放了所申请的动态内存,但依然继续引用
6)越界访问
13.结构体可以直接赋值,将一个结构体直接赋给另一个结构体。数组不行
结构体变量作为参数传递是值传递,和int等类型基本一样
14.当一个变量有几个固定可能的取值时,可以将这个变量定义为枚举
15.#pragma once //防止整个头文件被包含多次
#ifndef … #define …#endif //防止#ifndef 和#endif 包围的代码包含多次
16.判等的时候变量最好放在前面