將記憶體看為一條長街上面的房間這個比喻是很貼切的,慢慢的我才理解了這種比喻,每個房間都有有乙個門牌號,我們要尋找房間的話,通過這個房間門牌號可以找的到,當然我們要是知道這個房間更好,就不用通過門牌號了
int a = 10;
int *p = &a; //p的內容就是a的位址
可以通過門牌號,也就是指標來訪問,也可以通過這個房間的名字"a",來訪問這個變數,兩種方法,當然,在有些時候只能通過房間來訪問,而修改"房間裡面的內容"
void(int *left,int *right)
我想這個交換函式最能說明問題了,就是我們為什麼不能直接去找房子,而只能通過門牌號去訪問房子進行修改操作,這一塊還有乙個知識點,就是傳值,傳位址,傳引用,我也會在後面總結的,目前先要總結指標這個大山.
有時候我會想為什麼一定要malloc乙個人空間給指標,指標不是有空間嗎?
最後我理解了門牌號這個例子,門牌號就是位址,他也是需要空間來儲存的呀,不然怎麼完成定址功能,可能這和我們日常的稍微有點偏差,但是在計算機裡面就是這樣:指標他代表了一段位址,就是一段資料,那麼資料就應該是有大小的,在32位系統下,我們的指標大小是4位元組,在64位下是8位元組
多少位代表了可以定址的空間,32位也就是說可以定址32位的位址也就是32個1,換算成大小的話也就是4gb大小,也就是32位最多定址4gb (0x00000000-0xffffffff)的範圍,由於受限於作業系統實際可能比4g要小一點,因為你要給系統留一點操作空間.
所以這個門牌號也是需要空間的,所以指標也有自己所占用的記憶體空間,這個空間僅僅是門牌號,所以所有的指標型別的大小都是一樣的,在32位作業系統下就是4位元組,64位下就是8位元組大小
需要注意的是sizeof是在編譯器就開始做的事情.在程式執行之前,如果你的**裡面有sizeof,那麼就是相應的大小了
int *ptr;
*ptr = 10;
這個**肯定都知道,是不能通過編譯的,這樣操作是危險的,隨機分配乙個指標指向記憶體空間,如果這個空間是執行核心的乙個資料,那麼你修改了,系統不是就崩了,所以編譯器會提醒你,沒有初始化乙個指標,編譯通不過
怎麼辦?開闢乙個記憶體空間,來使指標來指向這個開闢的空間,這個記憶體空間我們不知道具體的位址,但是編譯器會給我們找乙個合適的空間,我們定義的指標完成了乙個指向,這樣這個指標就完成初始化了.
int *ptr = (int *)malloc(sizeof(int));
*ptr = 10;
執行計畫重編譯的時機
執行計畫的快取和重新使用 根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計畫效率降低或無效。sql server 將檢測到使執行計畫無效的更改,並將計畫標記為無效。此後,必須為執行查詢的下乙個連線重新編譯新的計畫。導致計畫無效的情況包括 對查詢所引用的表或檢視進行更改 alter table...
執行計畫重編譯的時機
執行計畫的快取和重新使用 根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計畫效率降低或無效。sql server 將檢測到使執行計畫無效的更改,並將計畫標記為無效。此後,必須為執行查詢的下乙個連線重新編譯新的計畫。導致計畫無效的情況包括 對查詢所引用的表或檢視進行更改 alter table...
c高階之指標2
1指標與強制型別轉換 int char short 相容型 是同一類屬於整型,他們的儲存方式 即轉換成記憶體中的二進位制的方式 是相同的,只是記憶體格仔長度不一樣。float是一類 double是一類 a做左值存數進去時,是按照a的資料型別來儲存的,用printf 來讀取時是按照裡面的 d,f,c之...