C++ const 與 extern

  1. C語言中, const修飾的全局變量是外部鏈接屬性,比如在 a.c文件中有
    const int m_a = 10;
    在b.c中想用這個全局變量, 在b.c中這樣
    extern const int m_a; 就可以使用a.c中的m_a

  2. C++ 語言中, const修飾的全局變量是內部鏈接屬性, 比如在a.cpp文件中有
    const int m_a = 10; 在其他文件中是沒法通過
    extern const int m_a; 來使用的。
    要在a.cpp文件中改成 extern const int m_a=10; 其他文件才可以使用。

  3. 其他不用const聲明的變量, 比如在a.c中
    int m_a = 10; 要想在其他文件中使用就使用
    extern int m_a; 這樣就可以了

分割線----
const修飾的變量分配內存的情況
以下情況 const變量才會分配內存
//1、局部變量const int a = 10 ;??int * p = &a //分配臨時內存??指針不可修改

const int a = 10 ; 這句話表示const int a是存放在符號表中的常量,a是鍵,10是值。

平時是不分配空間的。int * p = &a,這句話的時候,系統會臨時在棧區分配一個臨時空間temp,temp空間的值是10.之后將臨時空間的地址賦值給指針p。之后通過*p修改的是臨時地址里面的值,函數結束后該臨時空間會釋放。這種情況利用指針是不能修改a的值的。

//2、當加入extern 修飾const,也會分配內存??全局區 指針不能修改

extern會將const修飾的變量提升為全局變量,但是不能修改因為該變量是在全局區的ro.data區?全局變量沒有用extern const修飾,而是單純的const修飾,那么全局變量位置還是處于ro.data,只是作用域變小,當前文件內。

//3、用變量初始化const,也會另外單獨分配內存,如下????可以用指針修改值

int b =??10;

const int a = b;????//a和b的地址不一樣各自獨立分配空間 ?a地址在棧區

//4、const修飾一個普通變量的別名,別名的空間就是變量的空間。可以用指針修改

//此時f是c的別名??二者地址空間一樣

intc = 5;

const int &f = c;???//f接收變量的賦值,f是c的別名,f的地址就是c的地址

cout<< &c << endl;???//地址和下面地址一樣

cout<< &f << endl;

cout<< f << endl;??//結果5

intp= (int)&f;

*p= 55;

cout<< f << endl;??//結果55

cout<< c << endl;??//結果55

//5、const修飾一個字面值的別名時,分配臨時空間,此時別名就是臨時空間的別名,可以用指針修改值

const int &ref =10; //相當于int temp = 10;???const int& ref = temp;

int * p = (int*)&ref;

*p = 10000;

cout << ref << endl;//結果是10000,可以修改

//const int &a = 10;相當于系統首先開辟一個臨時空間int temp = 10;

//之后constint& ref = temp;相當于ref是這個臨時空間的別名(臨時空間在棧區)。

//而const這個時候修飾的實際temp地址的別名,temp的地址在棧區。

//通過指針是可以修改該塊地址空間的值的,該塊空間的值變了,也就是ref別名的值變了

//那么此時const int &ref = 10;中的ref存放位置就不是符號表中,所以用指針可以修改

//其值

//只要const修飾分配內存,可以通過間接方式進行修改(根據情況,如果在棧區或者

//堆區可以修改,如果在常量區不可以修改)

//6、函數返回值中,如果時用const別名接收一個變量,那么相當于上面第四種情況,

//此時f是a的別名??二者地址空間一樣

void showValue(constint & f) // const int &f??=a????f是a的別名,可以通過指針修改,

{??????????????????????????//但是加上const表示不要修改!(提醒功能)

//f = 1000;

int p = (int)&f;

*p = 100;

cout << f << endl;

cout << &f<< endl;???//地址同下面相同

}

void test02()

{

int a = 10;

showValue(a);

cout << &a << endl;???//地址和上面相同

}

//7、對于自定義數據類型 ,也會分配內存??可以用指針修改值

structPerson

{stringname;

intage;};

const Person p;??//p分配了空間,可以用指針修改
————————————————
版權聲明:本文為CSDN博主「五山口老法師」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Fly_as_tadpole/article/details/89459344

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382667.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談socket網絡編程函數參數(二)

bind()函數 bind()函數把一個地址族中的特定地址賦給socket。 例如對應AF_INET、AF_INET6就是把一個ipv4或ipv6地址和端口號組合賦給socket。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);參數解析 sockfd&#xff1a;即socket描述字&#xff0c…

對引用的理解3

對數組的引用&#xff0c; 相關語法 int main() { //引用于法// type &引用名 原名//數組的引用//1) 先定義一個數組int array[10];int (&refArray)[10] array;for (int i 0; i < 10; i) {array[i] i;}for (int i 0; i < 10; i) {cout << refArray[i…

運算符與,|與||的區別

|和&是位運算&#xff0c;運算結果是二進制數。 &&,||是邏輯運算&#xff0c;運算結果是真&#xff0c;或者假。 6&3110&0110102 6|3110|0111117&, &&和||計算時注意&#xff0c; 題目&#xff1a;條件1&&條件2&&條件3 如…

C++ 對引用的理解4

引用的注意事項 // 引用注意事項&#xff0c; 不能返回局部變量的引用 int & test3() { //因為局部變量出了函數體外 就會被銷毀int a 10;return a; }// 引用注意事項&#xff0c; 返回值如果是引用&#xff0c; 那么函數可以作為左值進行運算 int & test4() {static…

關于argc和argv的輸出

代碼 #include <stdio.h>int main(int argc ,char * argv[]) {printf("argc ->%d\n",argc);for(int i 0; i < argc;i){printf("%s\n",argv[i]);}return 0; } 輸出結果 [koulocalhost 8_6網絡計算器]$ ./a.out 192.168.1.1 9000 argc ->…

C++ 對引用的理解5

常量引用 int main() { // int &m 10; // 錯誤&#xff0c; 引用必須引一塊合法的內存空間&#xff08;什么是合法的內存空間&#xff0c; 這個10在程序中有內存嗎&#xff1f;&#xff09;const int &m 10; //加入const后&#xff0c;語法就通過了&#xff0c;編譯…

為什么計算機起始時間是1970年1月1日

1969年8月&#xff0c;貝爾實驗室的程序員肯湯普遜利用妻兒離開一個月的機會&#xff0c;開始著手創造一個全新的革命性的操作系統&#xff0c;他使用B編譯語言在老舊的PDP-7機器上開發出了Unix的一個版本。隨后&#xff0c;湯普遜和同事丹尼斯里奇改進了B語言&#xff0c;開發…

C++ 使用extern C簡單使用

先說一下函數重載&#xff0c; C 之所以會進行函數重載&#xff0c; 是因為對函數名進行二次修飾(重新命名) 在C文件中寫好的程序&#xff0c; C引入過來&#xff0c;卻沒法使用提示 無法連接的外部符號&#xff0c;那是因為C按照C的函數命名機制來尋找函數的實現. 第一種情況&…

IP數據包格式netinet/ip.h

轉載地址https://www.cnblogs.com/embedded-linux/p/4986449.html 頭文件netinet/ip.h中定義ip&#xff1a; struct ip{#if __BYTE_ORDER __LITTLE_ENDIANunsigned int ip_hl:4; /* header length */unsigned int ip_v:4; /* version */#endif#if __BYTE_ORDER __BIG_ENDIA…

c 結構體的簡單封裝1

先看C語言的 借助結構體 struct Person{char name[64];int age; }; void PersonEat(struct Person *p) {printf("%s在吃飯", p->name); } void test() {struct Person p;strcpy(p.name, "隔壁老王");PersonEat(&p); }

C++ 構造函數分類以及調用

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;//1、分類 //按照參數進行分類 有參構造函數 無參構造函數&#xff08;默認構造函數&#xff09; //按照類型進行分類 普通構造函數 拷貝構造函數 class Person { public://默認構造Per…

內存泄漏Valgrind

#內存泄漏Valgrind valgrind --toolmemcheck --leak-checkfull [Your progame option]; https://cloud.tencent.com/developer/article/1006199 https://www.cnblogs.com/zhoudayang/p/6110360.html https://www.cnblogs.com/napoleon_liu/articles/2001802.html https://…

C++ 拷貝構造函數的使用場景

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默認構造函數調用" << endl;}Person(int a){m_Age a;cout << "有參構造函數調用" << endl;}Person(co…

大數據多路歸并算法

https://blog.csdn.net/wongson/article/details/49209903 先把一個大的數據分成若干小份&#xff0c;然后對這些小份文件進行排序。排序好之后對這些小份文件進行如下處理。 我們舉個簡單的例子&#xff1a; 文件1&#xff1a;3,6,9 文件2&#xff1a;2,4,8 文件3&#xff…

C++ 深淺拷貝 01

1.C中成員對象如果指向了堆內存的空間&#xff0c;如果這時候使用了系統提供的拷貝構造函數&#xff08;默認淺拷貝&#xff09;&#xff0c;會造成內存重復釋放的問題&#xff0c;導致程序down掉&#xff0c;解決辦法修改默認的拷貝構造函數&#xff0c;也給新的對象需要堆內存…

文件描述符和fcntl及阻塞非阻塞

Linux 文件描述符和重定向 https://www.cnblogs.com/chenmh/p/5382044.html fcntl函數的用法總結 https://www.cnblogs.com/zxc2man/p/7649240.html 簡述linux同步與異步、阻塞與非阻塞概念以及五種IO模型 https://www.cnblogs.com/chaser24/p/6112071.html

C++拷貝構造函數的調用時機

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默認構造函數調用" << endl;}Person(int a){m_Age a;cout << "有參構造函數調用" << endl;}Person(co…

守護進程nohup的用法

使./a.out后臺運行 nohup ./a.out & exit // 如果你使用的bash客戶端或者是screen窗口&#xff0c;直接關閉窗口那么該進程也會終止&#xff0c;所以要用exit關于nohup重定向 在使用nohup命令的時候&#xff0c;經常由于輸出nohup.out的路徑沒有寫入權限&#xff0c;而無…

C++ 不懂的地方 記錄01

C 中初始化列表&#xff0c; 的詳細使用&#xff1f;沒有默認構造函數的類類型&#xff0c;因為使用初始化列表可以不必調用默認構造函數來初始化&#xff0c;而是直接調用拷貝構造函數初始化 這句話不是很理解 //手機類 class Phone { public:Phone(string pName){cout <&…