經驗:1.如果用ap和bp的話,是無法引用的,因為它不是指向乙個常量的。
2.如果用ap1和bp1的話,可以引用,但是交換的其實是
位址,因為常量區是無法被修改的。
3.而如果把函式改為
字元的引用,就是交換的是內容。
想想這是為什麼?上面的為什麼指向的是常量區?
二、為了解決這個疑問,我們來看看實質的差別:
int main()
;char b[9] = ;
char *c = "i like c";
//執行到這裡我們來看看位址截圖1
strcpy_s(a, strlen("hello") + 1, "hello");
strcpy_s(b, strlen("hello") + 1, "hello");
//strcpy_s(c,strlen("hello") + 1, "hello");//這樣不行哦
c = "hello";//這樣為什麼可以?
//執行到這裡我們來看看位址截圖2
位址2:
看看實際位址和變數型別,有什麼不同,那麼現在明白了嗎?
某個常量
的。最後看看位址的範圍,是不是有些差別?
三、我們再來看看這幾種
位址2:
看圖後面的解釋,發現記憶體分為很多區域了,最後我來解釋下原因,
計算機在記憶體中分為以下區域:
1.棧區(函式引數值、區域性變數):
程式執行時由編譯器自動分配,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧,程式結束時編譯器自動釋放。
2.堆區(動態分配的):
在記憶體開闢另一塊儲存區域,一般由程式設計師分配、釋放。若未被釋放,則在程式結束時系統**。注意它與資料結構中的堆是兩回事,類似於鍊錶。
3.靜態區(全域性變數和靜態變數):
編譯器編譯時即分配空間,全域性變數和靜態變數的儲存是放在一起的。
4.文字常量區(常量字串)
常量字串儲存的地方。
5.程式**區(函式體的二進位制**)
存放函式體的二進位制**。
上面的記憶體概念很重要哦,對你以後的程式構思是很有幫助的,希望大家都記一下啦!
好了,朋友們,今天的知識學到了嗎?我們下次再會!
指標字串和陣列指標
指標是c語言的精髓,只有掌握好指標才算是真正學會了c語言,以下就是學習指標的例子 include main int n 5 sort name,n print name,n if strcmp1 name 0 name 1 0 printf s,s n name 0 name 1 if strcmp...
字串,字串陣列,字串指標!!
字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...
指標指向字串和陣列儲存字串區別
include void main 定義了乙個指向字串的指標,str是在棧上分配的變數,儲存的位址對應的是在常量區中分配的空間。aafg 是儲存在常量區裡面,是不能改變的。char str 其實存在一種 const char 型別的隱式轉換,而strcpy要做的改變常量,所以程式編譯的時候沒錯,執行...