c和c++中有三種定義:
1.const char *str,
2.char *const str,
3.char const *str.
現總結三者之間的區別:
一 char *const str
這是定義了一個指向字符的指標常量,即str的指向不能被修改,但是可以修改指標所指向的內容,
我們可以通過代碼來驗證修改str指向的內容:
#include<iostream>
using namespace std;
int main()
{
char arr[] = "abcdefg";//定義一個字串陣列,陣列名相當于首元素地址
char* const str = arr;
str[0] = '3';//通過指標p間接修改arr陣列的內容
printf("%s\n", arr);
}
結果如下:
但如果我們改變str的指向此時
#include<iostream>
using namespace std;
int main()
{
char arr[] = "abcdefg";//定義一個字串陣列,陣列名相當于首元素地址
char* const str = arr;
str++;//修改str的指向
printf("%s\n", arr);
}
此時編譯器報錯了
char *const str 就差不多是這樣告訴編譯器我str是指向a的即陣列arr的首元素地址,我str指向你a之后就不能在變了,以后就是你的人了
二 const char *str
定義一個指向字符常量的指標,在這里str是一個指向char*型別的常量,也就是不能通過str來修改所指向的內容,用通俗的話來說就是*str的值為const,不能修改,但這并不意味著str所指向的值是一個常量,這個常量是站在str的角度而言,站在str的角度這個值是一個常量,如圖所示str指向了arr,可以通過arr來修改arr的值,但不能通過str修改,
#include<iostream>
using namespace std;
int main()
{
char arr[] = "abcdefg";//定義一個字串陣列,陣列名相當于首元素地址
const char* str = arr;
arr[0] = 'w';
arr[1] = 'e';
printf("%s", arr);
}
結果:
通過運行結果我們發現我們可以通過arr直接修改里面的內容,這說明arr里面的內容不是常量,
但如果我們通過str去修改了
我們發現編譯器直接報錯了:
如果我們修改str的指向了
#include<iostream>
using namespace std;
int main()
{
char arr[] = "abcdefg";//定義一個字串陣列,陣列名相當于首元素地址
const char* str = arr;
str++;
printf("%s", arr);
}
我們發現這是沒有問題的
三 char const *str
這個其實和上面這種const char *str是等價的也就是 const char *str==char const *str,大家可以自行驗證
四 個人總結
const char *str和char const *str等價,可以直接修改指標的指向但不能修改指標指向的值,
char *const str可以直接修改指標指向的值但不能修改指標的指向,
其實也可以總結為:const 與*的位置關系如果const在*號的左邊那么可以直接修改指標的指向但不能修改指標指向的值,
如果const在*的右邊可以直接修改指標指向的值但不能修改指標的指向,
五 const 用途
可以為以下三點:
1.定義只讀變數,或者常量
2.修飾函式的引數和函式的回傳值
3.修飾函式的定義體,這里的函式為類的成員函式被const修飾的成員函式代表不能修改成員變數的值,也就是const成員函式只能呼叫const成員函式
4.只讀物件,只讀物件只能呼叫const成員函式
c語言里面的const能定義真正意義上的常量嗎?
答案是不能,這是因為c語言中僅僅是在編譯層來限定不能對const修飾的變數進行賦值操作,在運行期間是無效的,但在c++中在編譯期會把const常量放到符號表中,以后遇到這個常量會去符號表中找,所以在c++中的const修飾的變數是不可能被修改的可以
這里可以參考一下我的這篇初識c++https://blog.csdn.net/qq_56999918/article/details/119747949
拓展:
1.在C語言中的區域const常量是放在堆疊區全域的const常量是放在只讀存盤區,所以全域的const無法被修改,只是一個只讀變數
2,常量并不只是不可被修改并且他的值在編譯期間就已經決定了而不是在運行的時候決定,
3.const和宏是有區別的,宏是在預編譯期間完成文本替換,而const發生在編譯期間,比宏多了作用域檢查和型別檢查,
4.在c語言中只有enum才算的上是實作了真正的常量
博主知識水平有限,如果覺得不錯的話點個贊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/295224.html
標籤:其他
上一篇:Codeforces Round #739 (Div. 3)解題報告
下一篇:c++基礎——區分參考和指標






