資料結構文章推薦:
? 順序表和煉表實現圖書管理系統
? 多種方式實現英文單詞詞頻統計和檢索系統
? 深度優先搜尋判斷有向圖路徑是否存在
? 待更新
今天班上的一位學霸在學習資料結構的字串的時候遇到了乙個問題,這個問題就是他在寫**的時候,不管怎麼樣主函式裡就是不能夠給指標賦值,就算賦值了好像指標裡啥都沒有,更別說使用其他函式了。
首先宣告一下:這個問題其實並不難,個人認為這個問題只要簡單的認識兩個點——指標到底是什麼?指標到底怎麼用?就可以搞懂這個問題了!接下來我會用我認為最簡單的思路為有疑惑的同學一步步的講解,希望各位有耐心的看完,謝謝!!!
話不多說,我模擬了一下當時重要部分的**,具體如下:
void
output
(char *chars)
}int main()
output
(chars)
;return0;
}
**分析
1、從上述**可以看出,output中的乙個引數是char的指標,output這個函式目的就是簡單的輸出一下指標裡的東西。
2、主函式中定義了乙個名字為chars的字串指標,並且主函式中試圖利用迴圈對指標進行賦值。
3、主函式對名為chars的指標賦值完畢之後,最後呼叫output函式將指標的值輸出。
沒錯,你沒有看錯,就是這麼簡單的**!好了,最上述**的具體功能分析已經結束。
問題分析 & 問題解決
我們再看一下問題:主函式不能給chars這個指標賦值,在執行的時候就是輸入一串字元之後就中止程序了,就像這樣?:
那麼這種問題為什麼會出現?其實仔細看**,其他地方實際上都沒有寫錯,就是這個chars怎麼看都不順眼(實際上當時不是while迴圈是for迴圈,當時for迴圈也有一點小問題,所以這裡寫成了while)
當時是指標的錯誤,但是我沒有急著說,我在想什麼同學會這樣寫——主函式中有乙個chars的指標,output函式中的引數也為chars指標。沒錯,許多人都有個習慣,那就是認為主函式中要呼叫自定義函式,那麼傳過去東西的也必須是和自定義函式一樣的(都是指標)!這是我的同學犯錯的原因之一。
不急著矯正錯誤,如果順著其思路走下去,其實想法是沒錯的。因為在學資料結構的時候有個順序表,順序表中有個內容是這樣的?:
第一部分
//順序表資料結構
typedef struct sqlist
;第二部分:
//初始化順序表基本演算法
status initlist
(sqlist &booksystem)
第三部分:
//新增6本圖書
void
insertbook
(sqlist &booksystem)
}
當時他說有個地方搞不清,就是結構體中的elem也是個指標,在insertbook函式中也可以用下標形式給指標賦值,所以就按照這個思路寫了他的**。
乍一看好像也對,但仔細看看就不對了,我相信我的同學沒有仔細揣摩為什麼要有第二部分,而是直接照著第一部分和第三部分寫了**。沒有理解到初始化指標的作用,這也是我的同學犯錯的原因之二。
問題解決之指標到底是什麼?指標的作用方式?
知道了錯誤之後,就要糾正錯誤,糾正錯誤就從兩點搞起:1、指標到底是個啥?2、指標到底咋個用?——接下來就以我自己的想法和大家說一說,也許就能解決大家的疑惑了!
首先,指標是個啥?我們都知道指標這東西很重要,這東西就想駭客手裡的工具一樣,「指」到你的裝置,就能入侵你的裝置並且還能扒取並修改你裝置裡的資訊,但如果不去「指」,這個工具就缺少了入侵別人裝置的途徑,也就不能對別人的裝置為所欲為了。
上面已經說了指標必須得指到乙個東西才能改那個東西。那麼看上面**可以知道,光定義了乙個指標,但是沒把任何東西的位址給那個指標,那還怎麼能給那個指標賦值呢?這就是犯錯的第二個原因,沒有初始化指標!
這裡繼續強調一下第二個**示例中的第二部分,第二部分中將book陣列的首元素位址給了elem指標,所以才能執行第三部分的新增圖書的操作的?
booksystem.elem =
newbook
[maxsize]
;//分配記憶體空間
好了,到了這裡肯定有人會認為:給主函式裡的那個指標乙個被指的東西不就好了?就像這樣?:
int main()
output
(chars)
;return0;
}
確實,給乙個字元陣列讓指標去指,就可以通過指標給陣列賦值了。但還是有乙個問題——主函式中呼叫output函式時傳的是指標嗎?顯而易見,肯定不是,與上面所說的一樣,指標通過指向某個值之後再去獲取或修改那個值。再看下面的**?:
void
output
(char *chars)
int main()
主函式傳了個指標chars給output函式,output函式接收到chars之後,chars指向了chars然後執行輸出操作,兩者都是指標。聽著是不是很亂?還記得我說的犯錯的原因之一是什麼嗎?就是取了相同的名字所以容易讓人混淆!
我們將主函式中的chars改個名?:
void
output
(char *chars)
int main()
output
(c);
return0;
}
output函式接收到c之後,chars指向了c,如果說chars要取陣列的內容那麼是這樣的:指標chars去找指標c中所指的陣列的元素。不管怎麼樣,這樣也太麻煩了。我們直接傳陣列過去讓chars指不就好了嗎?這樣的話主函式就不用再寫什麼指標,老老實實寫個陣列再傳就ok了!
int
main()
ok,問題解決!
問題總結
我當時看到這個問題的時候,第一眼看過去好像還真是那麼回事,從上述的**分析也可以看出,其實這些**要幹什麼我們都懂,但我的那位同學就是遇到了這個『簡單』的問題。
為什麼說這個問題是個『簡單』的問題?還是文章開頭所說:這個問題其實並不難,個人認為這個問題只要簡單的認識指標到底是什麼?指標到底怎麼用?就可以搞懂這個問題了!
本人水平有限,我認為寫一些能給大家幫助的文章非常有必要,同時鞏固自己的思想,我認為邏輯思考能力十分重要,希望一些平時有很多疑惑的朋友務必要有思考的精神!
最後,如果大家覺得本文有幫助,記得支援一下哦!大二菜鳥歡迎交流!
關於指標的賦值問題
void copy 2th to sdram void 目的是將2048到4096的記憶體 拷貝到0x30004000 上 這時,pdwdest 0x30004000,也就是說pdwdest存放了乙個4位元組的int型,在進行解引用時,指向0x30004000 pdwdest 由於是int型 pdw...
如何理解指向指標的指標?
我在一篇教程中看到下面這段,它描述指向指標的指標是如何運作的。引用文章相關段落如下 int i 5,j 6,k 7 int ip1 i,ip2 j 現在我們可以這麼寫 int ipp ip1 那麼現在指標 ipp 指向了 ip1,ip1 指向了 i。ipp 就是 ip1,ipp 就是 i,或者說是 ...
如何理解指向指標的指標?
原文 我在一篇教程中看到下面這段,它描述指向指標的指標是如何運作的。引用文章相關段落如下 int i 5,j 6,k 7 int ip1 i,ip2 j 現在我們可以這麼寫 int ipp ip1 那麼現在指標 ipp 指向了 ip1,ip1 指向了 i。ipp 就是 ip1,ipp 就是 i,或者...