色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

變量聲明與定義

錢淋西2年前14瀏覽0評論

變量聲明與定義?

指針是c/c艸的靈魂,通過指針我們可以直接訪問內存對內存中的數據進行操作。這是像java,c#等高級語言所不具備的功能,但指針為我們帶來優勢的同時,它也是一把雙刃劍,c與c艸程序員的很大一部分錯誤都出在指針上。而且通常這樣的bug很難定位。就例如題主在題目描述中給出的這個問題。

我們先來回顧一下指針的概念,int *a表示定義了一個指向整形的指針變量a,a中應當存儲的是一個32位的地址值(x86平臺)或者64位的地址值(x64平臺)(實際上,不管a指向的是什么樣的變量,其位數都是固定的,因為地址長度不會隨變量發生改變)。通過*a的操作我們就可以從a中存儲的地址開始,讀出一個int型長度的值,在大多數編譯平臺中int是四個字節的。我們稱*a的操作為解引用。

接下來我們再來看看聲明和定義有何不同。

int a;這是聲明,表示在內存中已經存在了一個名為a的整形變量,在內存地址中占據四個字節。如果這句話寫在函數外部表示a是全局變量,編譯器在程序運行時會默認將其初始化為0(實際上,不管a是什么類型的變量,只要其是全局變量,都會被初始化為0)。在c++中如果a是類內部的static型變量,也會被初始化為0。而對其他情況而言,比如這句話是寫在函數內部的,那么a就不會被程序初始化,而我們顯然也沒有將其初始化,那么它的值是未定的。也就是在創建這個變量時,內存地址是什么值,它的值就是什么。有時我們會在運行程序時看到“燙燙燙”,這就是因為內存在上電時統一初始化為0xcdcd,而我們如果聲明了一個變量而未賦初值,那么它的值就是這個,而這個變量對應的中文gbk編碼就是“燙”,所以有時你就會看到“燙燙燙”。但是通常這類錯誤編譯平臺會幫我們檢測出來。

int a=1;這是定義,我們不光聲明了一個a,還將其初始值定為1。所以通常這樣的寫法才是安全的。

再來看題主的問題。int *a;表示我們聲明了一個指向整形的指針a,a中存儲的是一個整形變量的地址,我們對其解引用即可得到其所指向的整形變量。但是我們只是聲明,而沒有初始化,a中存儲的值是未知的。

*a=12;表示我們將該值取出后轉到這個值的地址,再讀出一個四字節長度的值,并把這四字節賦為12。這一操作顯然是不合理的,因為a中的值未知,所以這一操作很可能會抹掉程序中的重要數據甚至導致程序崩潰。

所以在使用指針時一定要謹慎謹慎再謹慎。所有的指針都應該在聲明時立即初始化。沒有指向的指針應初始化為nullptr。

題主畫了一句話“無論怎樣,指針都不會創建一個整型變量”。看起來很疑惑,這句話的意思是說你只聲明了一個指向整型的變量a,但是并沒有整型變量存在,a必須是指向整型變量的,只有同時聲明整型變量b,整型指針a,并把b的地址賦給a,a才是有意義的。

int b;

int *a=&b;

*a=12;

java 編譯變量,變量聲明與定義