每日一題(五)

2021-10-09 14:53:27 字數 2133 閱讀 6946

分析以下程式執行時各個變數的記憶體分布:

int a =0;

//全域性初始化區:.data

static

int b =20;

//靜態初始化區:.data

char

*p1;

//全域性未初始化區:.bss

const

int a =10;

//常量區 .rodata

intmain

(void

)

全域性變數 、靜態變數初始值為0,區域性變數,自動變數初始值隨機分配值。

注意:

void

main()

static修飾全域性變數是限制其作用域只在當前檔案中,static修飾區域性變數是擴充套件其作用域為當前檔案,相當於全域性變數。

陣列名和指標是兩個往往很容易讓人們混淆的概念,很多人以為陣列名就是乙個指標,也有很多人知道陣列名不同於指標但是僅知道陣列名的值不能像指標一樣改變,例如你可以寫出下面這樣的**:

複製

int *p;

p++;

卻不能寫這樣的**:

複製

int a;

a++;

那麼陣列名跟指標之間到底有什麼區別呢?

第一,在宣告上,除了作為函式引數的陣列名總是編譯器轉化成指標,其他情況下,陣列名就是陣列名,指標就是指標,二者不能混淆,你不能在乙個檔案中定義乙個陣列,而在另乙個檔案中把它宣告成乙個指標。

char a;  //定義乙個陣列a

extern char* a; //在另乙個檔案中將a宣告成乙個指標

在編譯器中,符號表用來存放c語言中有關識別符號的屬性資訊,這些資訊集中反應了識別符號的特徵屬性。等到詞法分析到**聲稱的各個階段的時候,編譯器需要根據源**提出的要求,從表中獲取不同識別符號的不同屬性。值得注意的是,陣列識別符號的屬性和指標是完全不同的。因此,在乙個檔案中定義乙個陣列的時候,編譯器會把它記錄在符號表中,而在編譯器分析另乙個檔案中的宣告時,通過符號的語義檢查發現不一致。也許這樣的宣告可以編譯通過(在gcc下通過了),但是把乙個陣列名當成乙個指標來使用,別指望它能執行起來。

第二,指標是乙個變數,而陣列名不是。陣列名是陣列的首位址,即它本身就是乙個位址,對應到組合語言級別就是乙個常量,乙個固定的數(位址)。因此陣列名不能進行++,–等運算。在大多數編譯器中,對陣列的引用a總是被編譯器改寫成*(a+i)的格式。也就是說,編譯器每遇到a,都會把它當作*(a+i)來處理。我們都知道,addr表示記憶體中(addr)的位置儲存的值,比如0x8048000就表示位址為0x8048000的記憶體中所儲存的值。所以a就表示a的值加上i所得到的數作為乙個記憶體位址裡面所儲存的值。

第三,對陣列的引用,如a,或* (a+1),需要訪存一次;而對指標的引用,如* (p+1),需要訪存兩次。如果理解了第二條的解釋,這個應該就不難理解。因為a被認為是常數,所以取*(a+1)的值只需將a所表示的常數加1,然後從得到的位址裡訪訪問一次即可。而對於指標,需要先從&p這個位址裡把p的值取出來,然後加1,再從得到的位址裡訪訪問一次,一共需要兩次訪存。

第四

假設a是乙個陣列名,而p是乙個指標,當你使用 a 和 &a 時,得到值是一樣的,都是陣列的起始位址。而使用 p 和 &p 時,得到的值是不一樣的, p 表示指標 p 所指向的位址,而 &p 表示 p 這個變數的位址。再假設

p = a;
則 p 就表示陣列a的起始位址,而&p是儲存陣列a的起始位址的那個位址。

c++中,類是乙個使用者自定義的資料型別,形式如下:

class

name

;

成員列表是類成員的集合,數目可以任意多對,類後面必須加上;作為結束。

對c++中成員的訪問,就是訪問資料或者函式,物件導向的程式設計中,經常把資料封裝起來,通過呼叫成員函式;來訪問成員資料。class中,每個成員的訪問屬性有:public、private、protected

實體化乙個物件的時候,一般要進行初始化操作,我們可以在class中寫乙個成員函式來初始化class成員資料,但是也可以直接使用建構函式來初始化成員資料(自動呼叫)。

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...

每日一題2018 3 22

leetcode 03 最長不重複子串 第一反應就是動態規劃。看到了網上的方法一。直接把問題簡化為找兩個重複字元間的最長距離,太巧妙了!class solution if i idx max locs s i i return max ling老師的方法二 仍舊轉化為動態規劃,但是為節省空間不再開個...