zoukankan      html  css  js  c++  java
  • 2019/02/10训练日记——指针总结

    一、指针的基本概念

    1.每个变量都被存放在某个内存地址(以字节为单位)开始的若干个字节中。若干个字节(根据类型确定字节)

    2.指针,也称作“指针变量“,大小为4个字节(或8个字节)的变量,其内容代表一个内存地址。

    3.通过指针能够对任意地址的内存区域进行读写。

    4.将内存比作房间,则指针内存储的是房间号。

    二、指针的定义

    类型名*指针变量名

    int *p; //p是一个指针变量,变量p类型是int *

    char * q; //q是一个指针变量,变量q的类型是char *

    double *r; //r是一个指针变量,变量r的类型是 double *

    void *s; //s是一个指针变量,变量s无类型。

    三、指针的内容

    int * w=(int *) 40000;

    w的内容,w是指向的地址40000。*w的内容,*w是w地址40000起始的若干字节(sizeof(int))的所储存的内容。

    通过指针访问指向的内存空间

    int*p=int *40000;//指向向地址40000;

    *p =123; 将123存入p所指向的地址后的若干字节(sizeof(int))的内存空间。

    int n=*p,将p所指向的地址后的若干字节(sizeof(int))的内存空间赋值给 n;

    四、补充

    1.*和&的区别

    (1)*p是指指针p指向地址的那个变量,例如int a=5;int *p=a;那么p的值是a的地址,也就是指针p指向a,p则等于a的值,即p=5。
    (2)&,则是引用,比如说有定义int a=5;再定义int b=&a;那么这里的b则引用a的值,即b=5,而再给b赋值:b=10,a的值也会变为10。
    (3)函数定义里的参数*和&的区别:
    					int x=0;
    					int *w=x;
    定义函数:			int a1(int a);
    					{
    						a=5;
    						return 1;
    					}
    定义函数:			int a2(int &a);
    					{
    						a=5;
    						return 1;
    					}
    定义函数:			int a3(int *a);
    					{
    						a=5;
    						return 1;
    					}	
    
    (1) 调用 int a1(x)后x的值还是等于0;int a其中a为形参,x为实参,函数调用的过程实际上是一种传参过程。将x的值赋给a后,函数操作与x无关,即a=x;a=5;
    (2)调用 int a2(x)后,x的值等于5;因为这里a引用了x的值。
    (3)调用 int a3(x)后,x的值也得等于5;此时不再是传参,而是传址,相当于w=a,w与a所指向地址相同。改变*a所指内容就改变 * w所指向的内容

    五、 指针的赋值(用法)

    指针的用法

    char a=‘A’;
    char * p=&a;
    char *m;
    m=p;
    int *t;
    t=(int) p;类型不匹配,编译出错,但可以使用强制类型转换。
    cout<<*p;
    可以使用char * a=6161(地址)但容易运行出现问题,因为地址不明确,不知道是本程序的内存地址,还是系统内存地址,或者某进程的地址。一般使用方式如上述。

    指针的运算
    1. 两个同类型的指针变量,可以比较大小
      地址p1<地址p2,->p1< p2 值为真。
      地址p1=地址p2,->p1== p2 值为真
      地址p1>地址p2,->p1 > p2 值为真
    2. 两个同类型的指针变量,可以相减
      两个T * 类型的指针p1和p2
      p1 – p2 = ( 地址p1 – 地址p2 ) / sizeof(T)
      例:int * p1, * p2;
      若p1 指向地址100,p2 指向地址60, 则
      p1 – p2 = (1000 – 600)/sizeof(int) = (100 – 60)/4 = 10
      3)指针变量加减一个整数的结果仍是指针
      int p;
      int n=a(a为某常数);
      p+n:地址p+a
      sieof(int)
      则类型为char或其他时,n+p、n-p时, (n+p)、(n-p)时都应该明白其含义。
      4)自增运算自减运算
      int *p=n;
      p++,++p;表达n=n+sizeof(int)
    $ ¥ $ ¥指针运算可以使用下标运算符[ ]

    int *p;
    int n;
    p[n]等价于 *[p+n]这不就是数组吗?

    例题
    访问int型变量a前面一字节
     int a;
     char *p=(char*)&a;
     --p;
     *p='M';
     cout<<*p;
    
    空指针

    地址0不能访问。指向地址0的指针就是空指针
    可以用“NULL”关键字对任何类型的指针进行赋值。NULL实际上
    就是整数0,值为NULL的指针就是空指针:
    int * pn = NULL; char * pc = NULL; int * p2 = 0;
    指针可以作为条件表达式使用。如果指针的值为NULL,则相当于为
    假,值不为NULL,就相当于为真
    if§=== if(p!=NULL) <----------> ensp if(!p)=== if( p==NULL )

    指针与数组的关系密不可分,明天整理。

  • 相关阅读:
    开通了
    A computer hardware platform abstraction
    脑机接口入门概览
    JDK自带VM分析工具jps,jstat,jmap,jconsole
    泛型里的super和extend
    动态规划
    用二分法查找的套路(一)
    A computer hardware platform abstraction
    CentOS7安装JDK1.8
    CentOS7如何修改hostname
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/12799106.html
Copyright © 2011-2022 走看看