指针的注意要点
1. 指针是没有类型的,它只是方便解引用
int a[]={1,2,3,4}; int* p =a; p = p+1; printf("%d\n",*p);//2
这段代码吧a换为char也能运行,p=p+1是因为获得了int类型,所以知道了下一个地址再4个字节之后
2. 关于一段代码
#include <cstdio> #include <cstdint> #include <cstdlib> int* makearr() { int a[1024]; for (int i = 0; i < 1024; i++) a[i] = i; return a; } int main() { int* a = makearr(); for (int i = 0; i < 1024; i++) a[i] += 1; return 0; }
这是一段经典脑残代码,makearr的数组是在栈上分配的,函数结束就释放掉了,所以a其实是个野指针,很危险。解决方法使用malloc在堆上分配
3. c++ std::array<>不会自动衰变成指针比较安全,会把数组封装成一个结构体,可以在函数中返回一个结构体,保证不会变成一个指针。
void func(int a[4]){ }
此处的int a[4]自动衰变成int* a
4. std::vector 会有三个指针,指针在栈上,指向的地址在堆上
5.
1.第一个错 https://www.bilibili.com/video/BV1US4y1U7Mh/?spm_id_from=333.788&vd_source=f0eb4fe9df3a8a0526ccd79400c54a03 printf("%f\n"",3) printf会把3当作浮点数来处理,但是3在浮点数的表示中,指数为2^-127,然后底数又很小,所以永远打印0. c语言没有重载,abs只接受int,float被隐式转换,没了小数位 浮点数使用fabs,或者不要使用c的全局函数,使用std::abs,有float重载 2.第二个错 是因为字符串要在末尾填充0,而你只申请了10个字节,而你输入也是10个字节,就没有位置写0了,在windows上直接报错 3.第三个错 int* a = (int*)malloc(1000),malloc只负责分贝1000个字节大小的内存,却不知道想要的是1000个int元素, 所以如果访问超过250,就会越界报错
6. int a[] 的括号源码 int& operator [](size_t i) noexcept