关于指针(详解)

  • 指针是什么?

    我们知道cpu在处理数据的时候,所需要的数据都是从内存里面读取的,处理过后有会放回去,那是如何来实现这个操作的呢?其实就是通过地址,而我们的指针就是我们所说的地址,而指针变量则是存放地址的变量。但我们在叫法上常把指针变量叫做指针。所以现在我们知道了我们所说的指针其实是指针变量,是一个存放地址的变量。

  • 指针的书写

    书写格式为:数据类型 + * + 变量名
    e.g.  int * n ;  (表示一个整形类型的指针变量)

    int a=10;
    int * p=&a;
    //这里表示一个整形指针变量p存放了整形a的地址

  • 指针变量的大小

    这个是非常值得一提的:指针变量的大小与其数据类型无关,都是一样的大小。
    什么意思呢?举个例子吧:int * a  与double * b  他们两个的大小的一样的,与int  double 无关。其实你可以把(int * ), (double* ) 看成一个整体,这个整体就是一个新的类型——指针类型,就好似所有的int 类型大小都是一样的,所有的double类型的大小都是一样的。
    指针的大小在64位电脑上是8个字节,在32位电脑上是4个字节

  • 指针的操作符( * )

    注意这里的 * 可与int * n不一样,你可以理解为int * n中的 * 是一个定义,为了说明这个变量是一个指针变量。但这里的 * 我们把它叫做“解引用操作符”,它的作用是通过指针变量里存储的地址,来访问其地址上存放的值

    #include<stdio.h>
    int main()
    {
    int n=10;
    int* p=&n;//将n的地址保存在p
    printf("%d",*p);
    //解引用p,通过p中存放的n的地址来访问此地址存放的值,即10
    return 0;
    }


     
  • 指针类型

    指针类型决定了指针进行解引用时访问几个字节,也就是说指针的类型代表了解引用时的访问权限:比如说char * 类型指针在解引用时只会访问一个字节,int * 类型指针则会访问四个字节

    指针类型决定了指针在+1 or -1时移动多远:int * +1(向后移动4个字节,即一个整形的大小)char * -1(向前移动一个字节,即一个char的大小)

    void * 指针:这是一个无具体类型的指针,可以去存放任意类型的指针,但它本身并不可以进行+、-、解引用( * )等操作

  • const修饰指针

    const修饰变量
    const  int n =10; 表示n不再能被修改,获得了常量的性质,但其本质依然是变量,故而我们称为“常变量”

    const修饰指针
    1. const 放在“ * ”的左边
    int const * p = &a; 表示(* p)被修饰,p所指向的内容不可被修改,但p本身是可以被修改的
    2.const放在“ * ”的右边
    int * const  p = &a;表示(p)被修饰,p本身不可被修改,但p所指向的内容可以被修改

    当然我们也可以在“ * ”的两侧都加上const,来进行双修饰

  • 野指针

    野指针指的是所指向的方向不可知(随机的、不正确的、没有任何限制的)
    1. 创建一个指针变量时没有初始化
    2. 指针越界
    3. 指向的空间注销了

    没有初始化,即创建指针时指针被赋予了一个随机值(是很危险的),如果我们没有初始化,并且在后面的代码中使用了解引用相对其中的值进行修改,那可以会导致非常严重的后果。(例如:假如这个指针指向了计算机中一个非常关键的数据,然后我们将其修改之后,计算机可能就爆了),故而我们在初始化的时候应将其初始化,知道指向哪里我们就赋具体的地址,如果我们还不知道具体指向哪里我们就赋值为空(NULL)!

    指针越界,我们就一个一维数组举例,arr[5]={1,2,3,4,5}; 指针的范围只能在这个数组范围内,一旦越出数组,指向的就是无效值

    指向的空间注销了,举一个例子如下

    #include<stdio.h>
    int* teat(void)
    {
    int n=10;
    int *s=&n;
    retrun s;
    }
    int main()
    {
    int * p=test();
    return 0;
    }

    我们可以看到,在函数test里创建了一个变量n,并且将n的地址存放到了s中,并将s返回存放到变量p中,但是!这里我们就要小心了,据我们所知,函数在执行玩后会自动销毁,也就是说当s变量返回放在变量p时,我们在函数里申请创建的int  n 变量的空间已经被销毁!!!p指向了一个无效的值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值