指標如何賦值?關於指標的理解

2021-09-28 14:27:22 字數 3398 閱讀 6679

資料結構文章推薦:

? 順序表和煉表實現圖書管理系統

? 多種方式實現英文單詞詞頻統計和檢索系統

? 深度優先搜尋判斷有向圖路徑是否存在

? 待更新

今天班上的一位學霸在學習資料結構的字串的時候遇到了乙個問題,這個問題就是他在寫**的時候,不管怎麼樣主函式裡就是不能夠給指標賦值,就算賦值了好像指標裡啥都沒有,更別說使用其他函式了。

首先宣告一下:這個問題其實並不難,個人認為這個問題只要簡單的認識兩個點——指標到底是什麼?指標到底怎麼用?就可以搞懂這個問題了!接下來我會用我認為最簡單的思路為有疑惑的同學一步步的講解,希望各位有耐心的看完,謝謝!!!

話不多說,我模擬了一下當時重要部分的**,具體如下:

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,或者...