zoukankan      html  css  js  c++  java
  • C++课程上 有关“指针” 的小结

    上完了C++的第二节课以后,觉得应该对这个内容进行一个小结,巩固知识点,并对我的心情进行了一个侧面烘托...

    开始上课的老师:

    正在上课的我:

    上去敲代码的我:

    过程是这样的:

    下来的我:

    非常的尴尬,简直是黑历史= =

    变量:

    变量有整形变量,浮点型变量,字符型变量,当然还有指针变量。对于32位操作系统而言,为字符型变量分配的内存单元是一个字节,整型是两个字节,单精度浮点型变量为四个,双精度浮点型变量为八个字节,今天要阐述的指针变量是四个字节。

    指针变量所存储的是地址。

    int a;
    int *pa;
    pa = &a; //将整形变量a的地址赋值给整型指针pa
    

    经过上面代码的处理以后,指针pa指向变量a。

    指针变量的定义:

    int *ptr1;
    float *ptr2;
    char *ptr3;
    void *ptr;
    
    

    指针变量的赋值:

    int *ptr,a = 4;
    ptr = &a; //将变量a的地址赋值给指针变量ptr
    
    

    经过上面语句的处理以后,整形指针指向整形变量a。原来以为整形指针和整形变量放在一起定义编译会出错,学习了:int *ptr,a=4;

    指针变量的引用:

    (1)

    int main()
    {
        int *p,m;
        scanf("%d",&m);
        p = &m; //指针p指向m
        printf("%d
    ",*p);
        return 0;
    }
    

    这段程序比较简单,没有什么问题。

    (2)

    int main()
    {
        int *p,m;
        p = &m;
        scanf("%d",p);
        printf("%d
    ",m);
        return 0;
    }
    

    我:“???”
    回来以后自己试了下,弄懂了这个内容,就是把之前输入的scanf中的&m替换为p。这里摘取一段C++中文网介绍scanf的说明。

    例如:&a、&b分别表示变量a和变量b的地址。
    
    这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
    
    

    (3)

    int main()
    {
        int *p,m;
        scanf("%d",p);
        p = &m;
        printf("%d
    ",m);
        return 0;
    }
    

    “这不行吧???”
    确实是不行的,程序崩溃。原因是因为其不安全性。

    指针:

    指针是一种特殊的变量,它存储的数值是内存中的一个地址。
    1.指针的类型
    2.指针所指向的类型
    3.指针的值 或者 指针所指向的内存区
    4.指针本身所占据的内存区
    

    指针的类型和指针所指向的类型:

    1.指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
    2.只需把指针声明语句里的指针名字和名字左边的指针声明符*去掉,剩下的部分就是这个指针所指向的类型。
    
    int *ptr; //整形 指针
    char *ptr; //字符型 指针
    int* *ptr; //整形指针 的 指针
    
    
    int (*ptr)[3]; //指向含三个整形元素的整形数组 的 指针
    int* (*ptr)[4]; //指向含四个整形指针的指针数组(array of pointers) 的 指针 
    

    这里注意“数组 指针”(a pointer to an array)和“指针 数组”(array of pointers)的区别,参考资料:指针数组和数组指针的区别

    void 指针

    int main()
    {
        int m = 5;
        void *ptr;
        ptr = &m;
        printf("%d
    ",*ptr);
        return 0;
    }
    
    

    编译错误。

    “void型指针,表示这个指针指向的内存中的数据的类型要由用户来指定。
    比如内存分配函数malloc函数返回的指针就是void *型,用户在使用这个指针的时候,要进行强制类型转换,也就是显式说明该指针指向的内存中是存放的什么类型的数据
    (int *)malloc(1024)表示强制规定malloc返回的void*指针指向的内存中存放的是一个个的int型数据。”
    
    

    指针的值:指针所指向的内存区。

    指针本身所占据的内存区:

    可以使用sizeof(指针类型),对于32位操作系统来说,系统为指针变量分配4个字节的长度。

    char *np;
    
    1. sizeof(char) // 1
    2. sizeof(*np) //4
    3. sizeof(char *) //4
    4. sizeof(char *p) //compiling error
    
  • 相关阅读:
    php CodeIgniter处理多环境错误级别配置
    bootstrap导航条在手机上默认展开二级目录,必须用setTimeout才能实现
    WordPress博客网站fonts.useso加载慢解决办法
    JS实现复制网页内容自动加入版权内容代码和原文链接
    bootstrap实现 手机端滑动效果,滑动到下一页,jgestures.js插件
    mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别
    js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法
    php防盗链,php ci在control里面控制除了自己站内的链接点击跳转,其他来源的都跳到站内页面
    php原子操作,文件锁flock,数据库事务
    默认只显示指定高度,出来按钮 阅读更多,加载全文,点击后显示全文的实现方式
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5469089.html
Copyright © 2011-2022 走看看