內容:
注意:
數組名是搜元素的地址
就算是用數組接受,本質上接受的仍是地址
地址就是指針,指針的大小取決於32位平臺仍是64位平臺
可是int類型的數組元素的大小就是int類型的
因此sz有兩種可能1(32位平臺)或2(64位平臺)
初階指針內容
一,字符指針
用法一:
用來存放字符變量的地址
用法二:
打印字符數組內容
直接用%s加數組首元素地址便可
根據字符串數組地址找到存儲的內容,用%s打印字符串內容
pc裏面存放的正是數組首元素地址因此能夠直接pc
用法四:
指針變量中儲存的是字符a的地址(即字符串的首字符地址)
分析:
指針裏存儲的是字符串的首字符地址
根據這個字符串的首字符地址找到存儲的內容
根據這個存儲的字符串內容進行打印
注意:
這種寫法是錯誤的
指針裏存儲的是字符串的首字符地址
將指針內容改爲別的字符地址
那根據改變後的地址將找不到以前的字符竄
最好加上const
若是進行p變量的修改時會報錯
推薦兩個技術問答社區的網站
推薦一本特別經典的書:
《劍指offer》
牛客網的劍指offer的編程題
重要例題講解:
輸出的是haha不是hehe
兩個數組是不一樣的空間進行存儲的,因此兩個數組的首元素的地址是不一樣的
輸出的是hehe不是haha
兩個常量字符串如出一轍,不能進行修改,因此abcdef是用同一塊空間存儲的
兩個指針指向的都是這塊空間中a的地址
因此指針p1 , p2 中儲存的地址相同
分析:
好的代碼習慣:
將存儲字符常量的變量前加個const
總結:
1.常量字符串不可修改,存儲在一塊空間中
2.存儲在變量裏的字符串能夠修改,存儲在不一樣的空間中
3.字符存放在字符數組中的是能夠修改的,每一個字符存放在相應的字符變量所對應的空間中
4.而存放在字符指針中是不可修改的,是常量字符串,指針裏存儲的是字符串的首字符地址
二,指針數組
[]的優先級要高於*
因此int* parr[10];爲指針數組
定義指針數組變量的時候,[10]說明parr是數組,*說明這個數組是指針,數組的元素個數是10個,int*說明數組的每一個指針變量的類型是int*
注意:
arr存放的是數組首元素的地址
指針數組存放的是相同類型變量的地址
指針數組的使用:
方法一:(不經常使用)
方法二:(實現多維數組)
結果:
分析:
三,數組指針
指向數組的指針
&arr存放的是整個數組的地址
[]的優先級要高於*
因此int* parr[10];爲指針數組
int(*parr)[10];爲數組指針
定義變量的時候,*說明parr是指針[10]說明是數組,數組的元素個數是10個,int說明指針指向的數組的類型是int
解析:
總之:
&arr和arr的區別主要是:
數組指針的使用:
方法一:(不經常使用)
方法二:
參數是數組的形式
最多見的一種方式,打印二維數組
解析:
參數是指針的形式
將二維數組arr想象爲一個一維指針數組
存放的是二維數組每一行的首元素的地址,
傳參的時候傳遞的是第一行的首元素的地址
根據p+i找到每一行的首元素地址
*(p+i)加一顆*表示,指向每一行的首元素地址後面的內容,至關於知道了一維數組首元素的地址
(*(p+i)+j)至關於根據每一行的首元素地址向後指向每一行中後面的地址
*(*(p+i)+j)解引用操做,根據地址找到地址所指向的內容
至關於(*(p+i))[j]
由於:
類比推得:
總結:
分析:
int(*)[5]是數組類型
parr3[10]是一個有10個元素的數組,每個元素都指向一個有5個int類型元素的數組
編程