动态

详情 返回 返回

深入理解指針Part2——const - 动态 详情

1 const修飾指針

const 是 constant 的縮寫,本意是不變的,不易改變的意思。在 C++ 中是用來修飾內置類型變量,自定義對象,成員函數,返回值,函數參數。

C++ const 允許指定一個語義約束,編譯器會強制實施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,就應該明確使用const,這樣可以獲得編譯器的幫助。

https://www.runoob.com/w3cnote/cpp-const-keyword.html

1.1 const修飾變量

變量是可以修改的,如果把變量的地址交給一個指針變量,通過指針變量也可以修改這個變量。但是如果我們希望一個變量加上一些限制,不能被修改,怎麼做呢?這就是const的作用。

可見無法直接修改n的值了,編譯器會報錯。

不過,如果我們繞過n,使用n的地址,去修改n就能做到了,雖然這樣做是在打破語法規則。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
    int const n = 10;
    //n = 3;
    int* p = &n;
    *p = 5;
    printf("%d", *p);
    return 0;
}

n的值通過指針被修改了,但是我們還是要思考一下,為什麼n要被const修飾呢?就是為了不能被修改,如果p拿到n的地址就能修改n,這樣就打破了const的限制,這是不合理的,所以應該讓p拿到n的地址也不能修改n,那接下來怎麼做呢?

1.2 const修飾指針變量

一般來講const修飾指針變量,可以放在*的左邊,也可以放在*的右邊,意義是不一樣的。

    int* const p;//放在*的右邊
    int const* p;//放在*的左邊

我們來看看下面的對比代碼:

void test1()
{
    int n = 10;
    int m = 20;
    int* const p = &n;

    p = &m;
    *p = 50;
}
void test2()
{
    int n = 10;
    int m = 20;
    int const* p = &n;

    p = &m;
    *p = 50;
}

int main()
{
    //int* const p
    test1();
    //int const* p
    test2();
    return 0;
}

結論:const修飾指針變量的時候

  • const如果放在*的左邊,修飾的是指針指向的內容,保證指針指向的內容不能通過指針來改變。但是指針變量本身的內容可變。(不能通過*p = ...來修改目標值)
  • const如果放在*的右邊,修飾的是指針變量本身,保證了指針變量的內容不能修改,但是指針指向的內容,可以通過指針改變。(不能p = ...來改變指針指向)

還有一種常見情況,*的左右兩邊都有const。這樣指針本身和指向的內容都不可修改。

void test3()
{
    int n = 10;
    int m = 20;
    int const* const p = &n;

    p = &m;//報錯
    *p = 50;//報錯
}

int main()
{
    //int const* const p
    test3();
    return 0;
}

正文完

user avatar yian 头像 cryptorzz 头像 guishangguandao 头像 aigoto 头像 javalover 头像 data_ai 头像 soujer 头像 wb_64322745e6aa2 头像 ticktank 头像 ansurfen 头像 chengshudehuanghuacai_b7tbl8 头像 liuruian 头像
点赞 15 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.