[英]Pointers in CPP, confusion regarding an example program
通過加速c ++工作。 有一個例子,有很多我不理解的東西。
double grade = 88;
static const double numbers[] = { 97,94,90,87,84,80,77,74,70,60,0 };
static const char* const letters[] = { "A+","A","A-","B+","B","B-","C+","C","C-","D","F" };
static const size_t ngrades = sizeof(numbers) / sizeof(*numbers);
for (size_t i = 0;i < ngrades;++i) {
if (grade >= numbers[i]) {
cout << letters[i];
break;
}
}
static const char* const letters[] = (...)
。 首先,我一直認為char是由'分隔的單個字符。 由“對我來說是一個字符串”的單個或多個字符分隔。 int* p=&x;
。 它們的優點是能夠像迭代器一樣使用(種類)。 但我真的不知道這里發生了什么,我們聲明一個指針字母,它被分配給一個值數組(而不是地址),這是什么意思? 這樣做的原因是什么? 關於你的第一個問題,字符串文字(例如"A+"
)是一個(只讀)字符數組,並且作為所有數組,它們可以衰減到指向其第一個元素的指針,即指向char
的指針。 變量letters
是一個常量指針數組(數組中的指針不能更改)到常量字符。
對於第三個問題, static
方法的不同取決於您聲明變量的范圍。它是在全局范圍中使用時的鏈接說明符,意味着變量(或函數)不會從轉換單元導出。 如果在本地范圍內(即在函數內部)使用變量,那么變量將在函數的調用之間共享,即對函數的所有調用將具有相同的變量,並且在調用之間保持它的值。 將類成員聲明為static
意味着它在類的所有對象實例之間共享。
1)在這里
static const char* const letters[] = (...)
letters
實際上是const字符的const指針數組。 因此,“”。
2)如上所述,上面的變量是指針數組。 因此,數組中的每個元素都將地址保存到數組中定義的字符串文字。 因此, letters[0]
保存存儲“A +”的存儲器的地址。
3) static
在C ++中有各種用途。 在你的情況下,如果它聲明了內部函數,它的值將在對該函數的連續調用之間保留。更多細節 。
static const char * const letters []
這是一個指向字符的數組。 在這種情況下,初始化列表將每個指針設置為初始化列表中指定的每個字符串的第一個字符。
const ... const
指針和指針指向的字符是常量。
靜態的
如果在函數內部聲明,類似於全局,但具有局部范圍。
鏈接:
那些不是字符而是字符串,所以你的理解是正確的。 這里的字母不存儲為char,而是以const char *的形式存儲。
我們聲明一個指針字母,它被分配給一個值數組(不是地址)
那些不是指針字母而是文字字符串,“a”是文字,它的類型是const char [],它衰變為const char * - 這意味着它是一個poitner。
3。
我知道java中的static是什么,CPP中的含義是相似的
一般來說是的,但是有區別 - 就像你不能在java中使用靜態內部函數而你可以在c ++中,你也可以在c ++中使用全局靜態變量。
作者寫道,這意味着編譯器只會初始化一次靜態值。 但是,在某個范圍內的每個變量都沒有完成嗎?
非靜態變量將在堆棧上創建,並在每個函數運行時默認初始化(如果沒有進行顯式初始化)。 另一方面,靜態變量將僅在第一次運行時初始化。
但這意味着即使在我的程序運行完畢后,這些靜態值仍然會被保存?
這不是真的,在程序完成后,它們被釋放 - 你的過程就已經死了
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.