1. 程式人生 > >C語言中const和C++中const關鍵字的區別

C語言中const和C++中const關鍵字的區別

# include "iostream"

using namespace std;

struct Teacher
{
    char name[30];
    int age;
};

void operatorTeacher(Teacher *pT)
{
    cout << pT->age<<endl;

}

void operatorTeacher1(const Teacher *pT)     //pT本身可以修改,pT指向的空間不可以被修改
{
    cout << pT->age << endl;
    pT = NULL;
    //pT->age = 10;  錯誤

}

void operatorTeacher2(Teacher * const pT)       //pT本身不可以修改,pT指向的空間可以修改
{
    cout << pT->age << endl;
    //pT = NULL;                              //錯誤
}

    int main01()
    {

        Teacher A;
        A.age = 33;
        operatorTeacher1(&A);

        system("pause");
        return 0;


    }
    void main02()
    {
        const int a = 10;
        int *p = NULL;
        p = (int *)&a;
        *p = 20;      //此處通過指標p間接修改a的值,如果在C語言編譯器中,則列印20!常量a被修改。所以C語言中const是一個                                   冒牌貨
                                  //但是在c++中此處列印的結果依然是10. 所以c++中的const才是真正意義上的常量。
                                //  在c++中用const定義一個變數,這個變數將會被放到一個符號表中,沒有給a分配空間!!!,當a在別的                                     檔案中被呼叫時或者被指標簡介訪問時才會分配空間給他,但是這個空間中的值和常量a是兩回事,通過                                  地址修改它不能真正的修改
                               //  符號表中的常量a!!!
        cout << a << endl;              
        

        system("pause");
    }

    void fun1()
    {
        #define a 1                              //  在fun1()中#define 定義的a=1; 可以在fun2()中使用,但是const定義的b則不行。
                                                         // 說明const關鍵字定義的變數是有作用域的!!!
        const int b = 2;
    }

    void fun2()
    {
        cout << a << endl;
        //cout << b << endl;
    }

    void main()
    {
        fun1();
        fun2();

        system("pause");

    }

相關推薦

C言中switch...case語句break的重要性

不能 實現 比例 重要性 case語句 毫無 ... 應該 switch 在C語言中switch...case語句是經常用到的,下面我介紹一下在使用該語句時候需要註意的一個細節問題。話不多說,直接舉例子: 例子1: switch(fruit) { case 1:printf

c言中fscanffprintf

寫的權限 set per efi errno fclose pri form price 很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,於是我們就想有沒有什麽函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解一下fscanf和fp

C言中typedefsizeof的註意事項

isp sizeof spa 註意 list數據 對象 audio 應該 user typedef的作用是給一個數據類型起一個別名。 typedef struct LIST { int data; }SeqList; SeqList 就相當於struct LIS

C言中 malloc free

from:http://blog.sina.com.cn/s/blog_af1a77fa0102xceb.html 一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(long NumBytes):該函式分配了NumBytes個位元

關於c言中mallocremalloc函式的分析

首先申明,這是本人第一次寫部落格,其目的僅僅是為了加強自己對知識點的掌握,為到達在本子上記筆記的效果 進入正題。對於malloc,它的作用就是為了動態分配空間,像c++中的new一樣。這裡就不說他們兩的區別了。malloc函式有這樣幾個特點。 1.分配的空間地址是連續的,

c言中staticauto的區別

1、static變數存放在靜態儲存區,在程式整個執行期間都不釋放;而auto變數存放在動態儲存區,隨著生命週期的結束而立即釋放。 2、static變數只賦值一次,以後就不用賦值;而auto變數在函式每呼叫一次都要賦初值

關於C言中“x++”“++x”的問題

關於一個變數在不同環境下自增自減的問題。 #include<stdio.h> int main() { int x = 8; int y = 0; y = (++x) + (x++) + (++x); printf("%d\n",y);

C言中printfscanf函式基本的引數型別輸出形式

printf函式的引數型別和輸出形式 字元 引數型別 輸出形式 d,i int 十進位制數 o int 無符號八進位制數(不含前導0) x,X int 無符號十六進位制數(沒有前

C言中“指標”“指標變數”的區別是什麼

比較嚴格的說法是這樣的:系統為每一個記憶體單元分配一個地址值,C/C++把這個地址值稱為“指標”。如有int i=5;,存放變數i的記憶體單元的編號(地址)&i被稱為指標。“指標變數”則是存放前述“地址值”的變數,也可以表述為,“指標變數”是存放變數所佔記憶體空間“

C言中i++++i的區別

C語言中i++和++i的區別 C語言中++i和i++是有區別的!快速理解的話就是用一句話概括: 1、i++是先賦值再運算+1; 2、++i是先運算+1再賦值; i++和++i都是c語言裡的自增,但是它們自增的順序不同。++i表示,i自增1後再參與其它運算,而i++ 則是i參與運算後,i的

C言中char*char[]用法區別分析

本文例項分析了C語言中char* 和 char []的區別。分享給大家供大家參考之用。具體分析如下: 一般來說,很多人會覺得這兩個定義效果一樣,其實差別很大。以下是個人的一些看法,有不正確的地方望指正。 本質上來說,char *s定義了一個char型的指標,它只知道所指向的

C言中char * char []的區別

問題引入: 在實習過程中發現了一個以前一直預設的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內容程式是會崩潰的,而後者完全正確。 程式演示: #include <iostream> usingnamespa

由淺至深->C言中unionenum關鍵字的經典問題分析

引言:由淺至深系列的第二篇文章,繼續體悟語言中的一些細節! 文章嚮導 union的自我介紹 union與系統大小端 enum列舉的引入 真正意義上的常量? 正文 一、union的自我介紹   union(聯合/共用體)在語

C言中typedefdefine的區別

    正確思考typedef和巨集文字替換直接的區別關鍵在於就是把typedef看成一種徹底的“封裝”型別——在宣告它之後不能在裡面增加別的東西。它和巨集的區別主要體現在兩個方面。    一、可以用其他型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名卻不

C言中getopt()getopt_long()函式的用法

一、命令列引數的使用 C程式的主函式有兩個引數,其中,第一個引數是整型,可以獲得包括程式名字的引數個數,第二個引數是字元陣列指標或字元指標的指標,可以按順序獲得命令列上各個字串引數。其原形是: int main(int argc, char *argv[]);或者是:in

C言中 if else if 的區別

c語言 不同 語句 class 我們 想要 main print nbsp 先看代碼:我們本意是對i不同的值有不同的判斷。 #include<stdio.h> int main(void) { int i = 1; if(i ==

C言中scanf、gets、fgets的區別

1.scanf會讀取標準輸入緩衝區中的輸入行內容直到遇到回車或空白(回車、tab、空格)以換行為例,會把換行符之前的資料全部讀入到scanf指定的變數中,回車(\n)依然儲存 在緩衝區中,等待下次讀取標準輸入緩衝區 遇到上面這種情況一般需要加入一下程式碼來清空快取區的行

c言中char *name 與char name 的區別

要點:char* name="abc"指的是常量字串,不可以修改指標,是相容老的寫法;char[] name="abc"是指標,可以修改;在學習過程中發現了一個以前一直預設的錯誤,同樣char *c = "abc"和char c[]="abc",前者改變其內容程式是會崩潰的,

C言中constC++const關鍵字區別

# include "iostream" using namespace std; struct Teacher {     char name[30];     int age; }; void operatorTeacher(Teacher *pT) {   

C++const關鍵定代表什麼含義?跟C言中const有什麼區別

 1.       const常量,如const int max = 100;  優點:const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)  2.       const 修飾類的資