zoukankan      html  css  js  c++  java
  • 牛课-C++基础知识-指针赋值

    1、C/C++指针参数赋值用法

    指针(pointer)是“指向(point to)”另外一种类型的复合类型,它实现了对其它对象的间接访问。定义指针类型的方法将声明符写成*d的形式,其中d是变量名,如以下代码声明了一个整形指针:int *ip1;

    指针赋值

    对指针进行赋值只能使用以下四种类型的值:(1)空指针(2)类型匹配的对象的地址(3)同类型的另一个有效指针(4)另一对象之后的下一地址。

    1)空指针

    空指针(null pointer)不指向任何对象。

    (1)赋值为空指针

    有以下几种方法可以将指针赋值为空指针。

    int *p1 = nullptr;
    int *p2 = 0;
    int *p3 = NULL;
    

    其中,nullptr是C++11新标准刚刚引入的一种方法。

    (2)不能赋值为整形变量,但是可以赋值为整形常

    把整形变量直接赋给指针是错误的操作,如

    int zero = 0;
    int *p1 = zero;
    

    如果将zero声明为常量值,则可以用其对指针进行赋值:

    const int zero = 0;
    int *p1 = zero;
    

    (3)未定义的指针

    如果只是声明了一个int指针,而未对其进行定义,如

    int *p4;

    2)类型匹配的对象的地址

    可以将指针赋值为其类型匹配的对象的地址。

    int one = 1;
    int *p5 = &one;
    

    此时p5的值是0x005CFB98,而0x005CFB98的内存中保存的值是4个字节的int类型的数据,其值为1。  

    3)同类型的另一个有效指针

    可以将指针赋值为同一类型的另一个有效指针。

    int *p6 = p5;
    

    p6的值与p5的值相同,都是0x005CFB98。  

    4)另一对象之后的下一地址

    还可以将指针赋值为同类型对象的下一个地址。

    int *p7 = p5+1;

    p7的值是0x005CFB9C,也就是p5的值0x005CFB98加上4个字节。

    ref:

    https://blog.csdn.net/hou09tian/article/details/73304756

    2、C/C++指针参数赋值问题

     关于在函数里对指针赋值的问题。首先可以看到如下现象:

    void test(int *p)
    {
        p = NULL;
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        int *t , y = 10;
        t = &y;
        test(t);
     
        return a.exec();
    }
    

     注意t并没有变为空指针,一直以为传递指针,赋值完这个指针也会变的,没想到其实指针也是一个变量,我们如果要改变它,必须找到它在内存中的地址,也就是指针的地址。也就是说,对于函数中,如果对指针的地址进行赋值,事实上是改变不了原指针的

    详细解释:当把指针t传递给指针p时,两者同时指向同一块内存地址,但是是不同的指针(即指针的内存是不一样的),p=NULL将p指针指向其他地方(空),所以并不会改变t的指向位置。

    void test(int **p)
    {
        *p = NULL;
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        int *t , y = 10;
        t = &y;
        test(&t);
     
        return a.exec();
    }
    

     另外,用引用赋值也可以解决这个问题:

    void test(int &p)
    {
        int n = 9;
        p = n;
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        int t , y = 10;
        t = y;
        test(t);
     
        return a.exec();
    }
    

     另外,可以修改指针指向的内容,而不是修改指针地址,也可以改变内容。

    例子1:

    void test(int *p)
    {
        int n = 9;
        *p = n;
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        int *t , y = 10;
        t = &y;
        test(t);
     
        return a.exec();
    }
    

     例子2:

    void test(int *p)
    {
        int n = 9;
        *p = n;
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        int t , y = 10;
        t = y;
        test(&t);
     
        return a.exec();
    }
    

    https://www.cnblogs.com/pinking/p/9339201.html

    3、给指针直接赋地址值

    p=0x3000 //错误的写法  

    加一个强制类型转换,注意转换后的类型要和指针指向的类型一致,并且这个整数的位长不能超过指针的位长。 比如: int addr = 0x10000004;int *p; 然后在后面的某处就能这样用: p = (int *)addr; 这个在单片机编程里面是很常见的。

  • 相关阅读:
    科学计算和可视化,做数据分析与雷达图。
    Leetcode 429 N叉树的层序遍历
    Leetcode 867转置矩阵
    Leetcode 832 翻转图像
    Leetcode 1052 爱生气的书店老板
    Leetcode 337打家劫舍 III
    Leetcode 766 托普利茨矩阵
    Leetcode 1438绝对差不超过限制的最长连续子数组
    Leetcode 697 数组的度
    Leetcode 567 字符串的排列
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/11684348.html
Copyright © 2011-2022 走看看