zoukankan      html  css  js  c++  java
  • C/C++中的指针(笔记)-指针基础知识总结

     1、指针概述

    2、指针和指针变量

    内存区的每一个字节都有一个编号,就是“地址”

    如果在程序中定义了一个变量,在对程序进行编译或者运行时,系统会给这个变量分配内存单元,并确定他的内存地址(编号)

    指针的实质就是内存地址,指针就是地址,地址就是指针

    通常我们叙述时会把指针变量简称为指针,实际他们的含义不一样

    3、指针的定义和使用

    //1指针也是一种数据类型

    //p 是一个变量,p的类型是int*

    int * p ;
    p = (int*)123;
    printf("%d
    ",(int)p)

    // 指针指向谁,就把谁的地址赋值给指针

    int a = 10;
    p = &a;
    printf("%p,%p
    ",p,&a);

    // 直接操作指针变量本身没有意义

    // 需要操作*p ,操作指针所指向的内存

    *p = 100 //*p 相当于a

    见图理解:

    4、指针变量和指针所指向内存的区别

    //*有两层含义

    定义变量时 ,*代表的是类型  ,它是指针类型int *

    在使用变量时,*代表操作指针所指向的内存

    5、野指针

    野指针就是保存没有意义地址的指针变量

     

    6、空指针

    //防止随便用指针

    //空指针,给指针变量赋值为Null

    //Null就是数字0

    7、指针大小

    //32位编译器用32位大小(4字节)保存地址

    //64位编译器用64位大小(8字节)保存地址

     8、多级指针

    //如何定义一个合适类型的变量,保存另一个变量的地址

    //在需要保存变量地址的类型基础上加一个*

     

    9、[ ] 不是数组的专属

    内存就是一个大数组,指针可以用[ ]

    10、万能指针

    首先不能定义void的普通类型 void a    ---报error(因为内存不知道要分配多少空间给a);

    可以定义void * 因为只有两种情况,一种是32位的,一种是64位的,可以分配固定空间

    万能指针:void *  =void *******可以指向任何类型的变量,使用指针所指向的内存时,最好转换它本身的指针类型

    例子:

    void *p = Null;
    int a = 10;
    p =&a;  注意这里保存的是a的首地址
    
    *p = 222;  这里会报错 ,因为*p不能确定给它多少内存空间,如果是int *那么是给4个字节/char*是给一个字节,
    但是void*,不能确定是给多少个字节,
    &a只是保存的是首地址,不能确定位数就不能确定尾地址要转换为
    * ( (int*) p ) = 222; //不做类型转换就无法确定步长,就无法确定操作多长的内存

    11、指针步长

    //1指针的加法不是传统的加法,

    //2步长由指针指向的数据类型决定

    int a;
    int *p = &a;
    printf(“p: %d,p=1;%d
    ”,p,p+1);
    
    // p:1637816   ,p+1:1637820   说明int占4个字节
    
    char b;
    int *q= &b;
    printf(“q: %d,q=1;%d
    ”,q,q+1);
    
    // q:1637795  ,q+1:1637796   char占一个字节

    12、const修饰的指针变量

     //指针变量的含义

    //指针所指向的空间

    int a =10;
    int *p1 = &a;
    *p1 = 100;// 等价于操作a, *p1操作指针所指向的空间
    p1 = Null; //操作指针变量
    
    // const 修饰*,代表指针所指向的内存是只读的
    const int *p2 = &a; 
    *P2 = 100; //这里会报错,因为*p2已变为只读
    p2 = Null;//这里操作的是指针变量
    //上面的等价于(看const的位置):
    int const *p3 = &a;
    *p3 = 100;//也会报错
    
    
    //const 修饰指针变量,代表指针变量的值为只读
    int * const p4 = &a;
    *p4 = 100;//OK
    p4 = Null;//err

    const int * const p4 = &a;//都不能改,全是只读
  • 相关阅读:
    Kafka Shell基本命令(包括topic的增删改查)
    thefuck的安装和使用
    Linux运维利器之ClusterShell
    MySQL数据库的10大经典错误案例
    Mysql 常用操作
    Git 忽略特定文件或文件夹
    为什么需要拷贝构造函数
    C语言编译过程
    设计模式之建造者模式
    设计模式之工厂/抽象工厂模式
  • 原文地址:https://www.cnblogs.com/Robertzewen/p/10469003.html
Copyright © 2011-2022 走看看