C語言指標問題

2007-09-18 12:41 am
我正在重溫C語言,可能太久沒碰的緣故,忘了大半。
假如
問題一
ptr1=&a (a是變數設a值為5就設inta=5)
指的是ptrl和a是同一位址?
所以*ptr1和a變數是同一數值(數值為5嗎?)?

問題二
有一個陣列a[i]
*ptr2=a
是 *ptr2指標儲存 a 記憶體位址?
若假設 *ptr2=a;
未何 ptr2=ptr2+1會等於 a[1]

其實
問題一
想問的是若ptrl=&a 是同一個嗎?
記憶體應該會配一個位址給指標,只是ptr1和&a佔用一個記憶體位址感覺怪怪的。


問題二
我覺得ptr和A[]的記憶體位址應該是不一樣的,我想ptr+1的位址應該跟陣列a的位址不一樣才對
只是如上式未何 ptr2=ptr2+1會等於 a[1]

也許我的邏輯有錯誤,只是我希望是理解。
指標跟變數若使用同一位址,我只是邏輯上不能接受。
還有指標位址為什麼能更改,陣列位址則不行。

我希望高手能幫我解惑,最重要能把記憶體如何搬運以及配置能很詳細的跟我解說。
我奉20點,因為此問題很久以前困擾我很多。
若我提的問題不夠詳細,在此先說聲抱歉。
還有,能不能請各位高手能以你們的見解把指標功能講解在詳細點。
更新1:

非常感謝以下各位大大幫我指點迷津,我已經弄懂了。 以前我讀C語言沒發生過這種指標問題,而且又修過資料結構。 由於2~3年已沒碰過程式,忘了快一大半,想說之前已學過的東西, 就把身邊C語言的書迅速瀏覽一次,卻誤讀了指標的定義。 當我想不透時,感謝以下各位大大所提供寶貴的意見。 而我又仔細的讀了一下,終於想通了。 我分析一下。

更新2:

假設a=5且*ptr1=&a結果如下: *ptr1=5 ptr1 = a位址 &ptrl = ptrl的本身位址 自從我把*和&弄清楚時,發覺指標變簡單許多。 若有想讀C語言的各位大大及水水,假如對指標不了解的地方。 希望此知識對你有些幫助。 下面兩位都對我有幫助,我很難做選擇,我想給大家幫我選。

回答 (3)

2007-09-18 4:48 am
✔ 最佳答案
Q1:
ptr1=&a (a是變數設a值為5就設inta=5)
指的是ptrl和a是同一位址?
所以*ptr1和a變數是同一數值(數值為5嗎?)?

A1:
是的
結果會是相同
但記憶體位置是不同的
指標將被指向變數(a)的記憶體地址存放在指標(*ptr1)內
假設a地址:0x22ff70
*ptr1會存放 [0x22ff70]的資料
但是*ptr1本身也其他不同的地址
當你要取得*ptr1的資料時
電腦會依照指標(*ptr1)內的地址[0x22ff70]去取得該地址中的變數內容
所以取出結果會是一樣的
程式實作:
(假設a=5且*ptr1=&a結果如下)
a=5
*ptr1=5
ptr1真實地址=0x22ff74
a 真實地址=0x22ff70
a存放在*ptr1的地址=00x22ff70

Q2:
有一個陣列a[i]
*ptr2=a
是 *ptr2指標儲存 a 記憶體位址?
若假設 *ptr2=a;
未何 ptr2=ptr2+1會等於 a[1]

A2:
這原理很簡單
假如a[5]
a被分配了6個記憶體位置a[0].a[1].....a[5]
則其記憶體地址必定為連續的(這點請特別注意)
我們給它一個假設承上題

變數=地址
a[0] = 0x22ff70
a[1] = 0x22ff71
a[2] = 0x22ff72
.
.
.
.
a[6] = 0x22ff76

接下來
請注意
*ptr2=&a;這串的寫法是會照成程式錯誤的唷!!!
必須是*ptr2=&a[i];(因為a已經是陣列)
假設我們作*ptr2=&a[0];
此時a[0]的記憶體位置已經放入指標(*ptr2)中了吧
得到的結果一定是
指標(ptr2)內容=變數(a[0])的地址 顯示如下:
ptr2=0x22ff70 (a[i]地址請對照上表)
因為你指向的是陣列
當你在做指標運算這個動作的時候(*ptr2+1)
你等於是把指標內容做了+1的動作(0x22ff70+1)
這樣的動作會改變原本指標內的地址位置(0x22ff70+1=0x22ff71)
你一定還記得剛才說到陣列地址是連續排列的
現在指標內的地址已經改變為(0x22ff71)
且這列地址(0x22ff71)剛好等於a[1]的地址
所以你會得到a[1]的變數內容

以上兩題解說完畢

講白了"指標"就像個抽屜
一個可以把"變數"放進去的抽屜
把a放進*ptr1這個抽屜
但是放進去的卻不是真正的實體只是a這個東西的所在位置
當把*ptr1抽屜打開時電腦自動去找出a的位置
找到後再把a這樣東西呈現在你眼前

"指標"說難也不難
只是有點抽象罷了
請慢慢吸收囉

2007-09-17 20:53:35 補充:
錯誤修改:
a[6] = 0x22ff76<-陣列打錯
a[5] = 0x22ff76<-a[6]修改為a[5]
參考: Myself
2007-09-18 6:01 am
http://www.phpbbserver.com/graphicsparalle/viewtopic.php?p=196
那篇 二維陣列釋疑 有提到你問的問題。
但它本身是談 二維陣列/指標 / 動態配置 的問題,並不是針對您的問題寫的,
所以,對您目前可能沒有直接的幫助。

有興趣可以去看一下。 ^_^
2007-09-18 4:42 am
問題一:
int *ptr1;
宣告一個變數,它是整數型態的指標變數。
不加星號:ptr1
這個變數,所儲存的資料,是「記憶體位址」。
加星號:*ptr1
這個變數,它會經由它自己本身所儲存的資料,即「記憶體位址」,再把這個記憶體位址所儲存的資料,取出來。
所以,經過 ptr = & a 的設定後,利用 *ptr ( 加星號 ) 把 a 的資料取出來。
問題二:
你寫錯了,應該寫成 ptr2 = a ; 才對,沒有加上星號。
宣告陣列 a [ i ],那麼 a 這個變數本身儲存了陣列 a [ i ] 的「起始位址」,所以變數 a 就是一個指標變數。
令 ptr2 = a 時,ptr 儲存陣列 a 的「起始位址」,也就是 a[ 0 ] 的位址,所以 ptr2 = ptr2 + 1 ; 的設定後,ptr2 指標儲存的位址就是 a [ 1 ] 的位址。

假如你是一個指標變數,假設你家在某公寓的 3 樓,而你現在的位置是在 2 樓,爬了 1 層樓 ( 指標加 1 ) 之後,就到達 3 樓了。
參考: 呆頭呆腦的小綿羊


收錄日期: 2021-04-28 23:14:43
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20070917000016KK05369

檢視 Wayback Machine 備份