指针的注意要点

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

posted @ 2022-07-24 19:27  heisse  阅读(35)  评论(0编辑  收藏  举报