美文网首页
2019-05-22 常量与指针,数组与指针

2019-05-22 常量与指针,数组与指针

作者: 知成 | 来源:发表于2019-05-22 18:52 被阅读0次

    常量与指针,数组与指针


    常量与指针

    常量与指针的关系很容易弄混,为此我专门在此记录一下。

    常量指针

    • 指向常量的指针,用const修饰的指针所指向的地址内容不可以改变。
    int value = 500;
    const int *temp = &value;
    

    如上述代码所示,不能用指针temp去修改value的值,前面的const是为了确保value的值不被temp修改而存在的。(经常会用在函数的形参需要传入指针时,并且不希望形参被修改,而使用const修饰)
    ···
    虽然上述代码中temp不可以用来改变value的值,但是它的指向是可以改变的,如下所示。

    #include<stdio.h>
    
    int main()
    {
        int value1 = 200;
        int value2 = 300;
        const int *temp;
        //先使temp指向value1
        temp = &value1;
        printf("# %d\n", *temp);
    
        //再使temp指向value2
        temp = &value2;
        printf("# %d\n", *temp);
        getchar();
        return 0;
    }
    
    • 程序执行结果如下:

    # 200
    # 300

    指针常量

    • 特指指针所指的地址不可变(但可通过此指针去修改所指地址的内容)具体表达形式如下。
    int value = 200;
    int num = 300;
    int *const pcount = &value;
    //pconut = &num;    //错误操作
    

    上述代码中pcount指向value后将不可以再指向别的地址。

    #include<stdio.h>
    
    int main()
    {
        int value1 = 200;
        int value2 = 300;
        //temp1指向value1
        int *const temp1 = &value1;
        printf("# %d\n", value1);
    
        //用temp1修改value1
        *temp1 = value2;
        printf("# %d\n", value1);
        getchar();
        return 0;
    }
    
    • 程序执行结果:

    # 200
    # 300

    数组与指针

    指针与数组的结合中“指针数组”与“数组指针”容易使人混论,原因之一是名字比较绕,另外它们的书写形式也很象。在理解这个问题上,我觉得从符号的优先级上去理解比较容易区分。

    指针数组

    int *p[3]; 
    

    如上所示,“[]”的优先级高于“*”,因此可以理解为 3 个 int*,类型的数据,对应的二维数组应该是 int temp[3][] = {};

    • 具体应用如下:
    #include<iostream>
    
    int main()
    {
        int *p[3];
        int temp[3][3] = {
            {0,1,2},
            {3,8,7},
            {6,9,4}
        };
        for (int i = 0; i < 3;++i)
        {
            p[i] = temp[i];
        }
    
        //用指针数组打印temp数组的数据
        for (int i = 0;i < 3;++i)
        {
            for (int j = 0;j < 3;++j)
            {
                std::cout << temp[i][j] << " ";
            }
        }
    
        getchar();
        return 0;
    }
    
    • 程序执行结果如下:

    0 1 2 3 8 7 6 9 4

    数组指针

    int (*p)[3];
    

    如上所示,“()”的优先级高于“[]”,因此可以理解为指针p指向了int类型且大小为3的一维数组的首地址。

    数组指针与二维数组

    int *p[3];
    //可将上述的数组指针理解为 int p[][3] = {};
    
    • 具体例子如下:
    #include<iostream>
    
    int main()
    {
        int (*p)[3];
        int temp[3][3] = {
            {0,1,2},
            {3,8,7},
            {6,9,4}
        };
        p = temp;
    
        //用指针数组打印temp数组的数据
        for (int i = 0;i < 3;++i)
        {
                    // p+1 相当于加3个int类型的长度
            std::cout << (*(p + i))[0] << " " << (*(p + i))[1] << " " << (*(p + i))[2] << std::endl;
        }
    
        getchar();
        return 0;
    }
    
    • 执行结果如下:

    0 1 2
    3 8 7
    6 9 4

    相关文章

      网友评论

          本文标题:2019-05-22 常量与指针,数组与指针

          本文链接:https://www.haomeiwen.com/subject/yafpzqtx.html