找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 10173|回復(fù): 54
打印 上一主題 下一主題
收起左側(cè)

關(guān)于C語(yǔ)言的指針,與教材不一樣的解釋

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
C語(yǔ)言中為什么要設(shè)計(jì)指針這個(gè)東西,這個(gè)東西的設(shè)計(jì)原理是什么,本來(lái)就是個(gè)很簡(jiǎn)單的東西,小學(xué)生思維就夠了。還有,這些原理之類(lèi)的,對(duì)于使用C來(lái)編程的人來(lái)說(shuō),也是必須完全了解的,了解的深度與你編程時(shí)的輕松度密切相關(guān),所以,弄清這個(gè)對(duì)你很重要。

總有人在問(wèn)指針是干什么用的,那我先說(shuō)說(shuō)我的理解:獲取某個(gè)數(shù)據(jù)所在單元的地址值,由此推算出其它數(shù)據(jù)所在單元的地址值,以用于找到這個(gè)數(shù)據(jù)所在的存儲(chǔ)位置。
計(jì)算機(jī)編程,可以說(shuō),基本就是對(duì)存于存儲(chǔ)器中的數(shù)據(jù)進(jìn)行操作,這就牽扯到一個(gè)最重要的問(wèn)題:你現(xiàn)在要操作的數(shù)據(jù),存在哪個(gè)地方?
想要弄清這個(gè)問(wèn)題,最根本的方法,是了解芯片的設(shè)計(jì)和工作基本原理與基本結(jié)構(gòu)組成。當(dāng)然,如果知道存儲(chǔ)器的大概結(jié)構(gòu),也算是有了一個(gè)基礎(chǔ)。這里我不講這么多,因?yàn)閷W(xué)單片機(jī)的人,基本的知識(shí)應(yīng)該還是有的,不是那種不與硬件打交道的程序員,所以不需我多講。

C與匯編有兩個(gè)根本的區(qū)別,造成了C中指針的產(chǎn)生:一個(gè)是數(shù)據(jù)所存儲(chǔ)的地址是由C編輯器自動(dòng)分配的,程序員沒(méi)自主權(quán),所以一個(gè)數(shù)據(jù)存儲(chǔ)的地址,程序員是不知道的;二是C編程中所用到的數(shù)據(jù)的長(zhǎng)度與存儲(chǔ)單元容量的不一致導(dǎo)致一個(gè)數(shù)據(jù)可能會(huì)占據(jù)數(shù)個(gè)存儲(chǔ)單元,由此造成數(shù)據(jù)存儲(chǔ)地址值的不連續(xù),這個(gè)現(xiàn)象造成的原因在于,不管你是8位機(jī)、16位機(jī)還是其它位機(jī),一個(gè)存儲(chǔ)單元的位數(shù)都是8位,這個(gè)是芯片設(shè)計(jì)就如此,原因自然主要是兼容問(wèn)題而不得不做出的選擇。本段所述的現(xiàn)象,在下面的比喻之中會(huì)進(jìn)行解釋。

C語(yǔ)言編寫(xiě)的程序,在程序運(yùn)行中,你所要處理的數(shù)據(jù)存在哪,你是必須知道的,否則你找不到這個(gè)數(shù)據(jù)在哪,你的程序就沒(méi)法編下去了;如果你把數(shù)據(jù)所在的位置給弄錯(cuò)了,那這個(gè)程序在運(yùn)行中就得不到你想要的結(jié)果。

有關(guān)數(shù)據(jù)存在哪,及如何找到這個(gè)位置,我打如下一個(gè)比方:
我們知道,賓館的房間都是有編號(hào)的,而且是用數(shù)字來(lái)編寫(xiě)的,很統(tǒng)一,一個(gè)房間一個(gè)編號(hào);每個(gè)房間的大小都是一樣的,也就是說(shuō)其容量是一樣的。賓館來(lái)了一家一家的,住哪間?賓館前臺(tái)來(lái)安排,一家人數(shù)少,可能就是一間,人數(shù)多了,可能就得幾間了,也就是說(shuō),同樣是一家,可能他只占據(jù)一個(gè)房間編號(hào),也有可能占據(jù)數(shù)個(gè)房間編號(hào)(這就造成了地址編號(hào)的不連續(xù)),這個(gè)數(shù)據(jù),只有前臺(tái)知道。如果你想去找到哪一家,你怎么找?你一個(gè)房間一個(gè)房間地去看單子也好看現(xiàn)場(chǎng)也好,都不是個(gè)辦法,一般情況下,每一家都是有個(gè)名字的,如張家、李家、王家、陳家等等的,你告訴前臺(tái),前臺(tái)根據(jù)這個(gè)名字查一下,就會(huì)把這家的第一個(gè)房間的編號(hào)(首地址)給了你,而你在事先知道他們家人數(shù)及賓館每間房能住的人數(shù)的情況下,也就知道了他們家占幾間房。這個(gè)比方里,與C語(yǔ)言中的情況極其相似,就是存儲(chǔ)內(nèi)容物的位置都是用統(tǒng)一數(shù)字編號(hào)來(lái)標(biāo)識(shí)的,存儲(chǔ)內(nèi)容的每一個(gè)單元(房間)的容量都是固定一致的,每一個(gè)(組)數(shù)據(jù)(一個(gè)家庭)都是有一個(gè)名字的,單個(gè)數(shù)據(jù)的長(zhǎng)度(某個(gè)家庭人數(shù))你事先是知道的,內(nèi)容物的存儲(chǔ)位置分配是由他人分配而你事先是不知道的,其占據(jù)幾個(gè)存儲(chǔ)單元數(shù)量你是事先知道的。

同樣的原理,在C語(yǔ)言中,要找到一個(gè)數(shù)據(jù)的首地址,我們先要把這個(gè)數(shù)據(jù)的名字給編輯器(前臺(tái)),編輯器就會(huì)依據(jù)這個(gè)名字把這個(gè)數(shù)據(jù)存儲(chǔ)單元的首地址給你,這個(gè)動(dòng)作,就是在這個(gè)數(shù)據(jù)的名字前面加一個(gè)“&”,其首地址值就出來(lái)了。
然后這里就又有了一個(gè)問(wèn)題,這個(gè)查出的地址值,放在什么地方?賓館是可以將地址值寫(xiě)在紙上,那計(jì)算機(jī)呢?它能放這個(gè)數(shù)據(jù)的地方,還是只有存儲(chǔ)器,當(dāng)然,你也可以為存儲(chǔ)這些個(gè)地址而單獨(dú)在芯片中設(shè)計(jì)一個(gè)專(zhuān)門(mén)的區(qū)域,那你可以算是創(chuàng)新,但是,現(xiàn)有的芯片怎么辦?沒(méi)辦法,還是只能存于現(xiàn)有的存儲(chǔ)器之中,于是,C編輯器還得給一個(gè)房間(存儲(chǔ)單元)專(zhuān)門(mén)用于存儲(chǔ)這個(gè)地址值,然后,這個(gè)單元編號(hào)是多少?程序員又不知道了,因?yàn)橛质蔷庉嬈髯詣?dòng)分配的,所以,沒(méi)法,又得給這個(gè)取個(gè)名字以便查找利用,所以,在將要存入的內(nèi)容存入之前,得先對(duì)要存入的內(nèi)容進(jìn)行定義(取名)一個(gè)變量,這樣我們以后就可以用名字直接找到這個(gè)內(nèi)容了。

下面就談?wù)?/font>C中有關(guān)獲取地址與使用地址的一些規(guī)則,有關(guān)這個(gè)概念的名詞,現(xiàn)有教材都稱(chēng)之為指針,本人對(duì)這個(gè)名詞比較不感冒,這個(gè)名詞顯然沒(méi)能與“地址”一詞緊密聯(lián)系,于是不易理解不易記。ìF(xiàn)有計(jì)算機(jī)教材中,類(lèi)似槽點(diǎn)很多):
存放入單元的內(nèi)容要要先取個(gè)名字,也就是所謂的定義(前面已經(jīng)解釋過(guò)),這個(gè)因?yàn)橹羔樧兞康墓δ懿煌,所以定義變量名時(shí),也要給出區(qū)別,讓編輯器知道這個(gè)變量的用途,也讓讀程序的人知道這個(gè)變量是用于存儲(chǔ)地址的,也就是所謂的指針變量。其進(jìn)行區(qū)別的規(guī)則是變量名前面加一個(gè)*”以示區(qū)別,如果不加會(huì)怎么樣?你照樣可以將取得的地址值存入其中,但是,你用這個(gè)變量去取這個(gè)地址所指向數(shù)據(jù)時(shí),程序在編譯時(shí)就報(bào)錯(cuò)了,這個(gè)現(xiàn)象,只是編輯器的硬性規(guī)定,也是有道理的。其實(shí)編輯器在分配指針變量在存儲(chǔ)器中的位置時(shí),也沒(méi)做什么特殊處理,它與其它變量都是統(tǒng)一分配地址的,基本也是順序分配,誰(shuí)先使用誰(shuí)先排前面(不是誰(shuí)先定義誰(shuí)先排前面),一點(diǎn)也不特殊。

在使用指針來(lái)取得存儲(chǔ)單元中的數(shù)據(jù)時(shí),C的規(guī)定也是在指針變量名前加一個(gè)“*”以示這個(gè)是用地址值來(lái)取得數(shù)據(jù),如a=*p,它的含意是:P所表示的存儲(chǔ)單元中的數(shù)據(jù),是一個(gè)地址值,a=*p就是把這個(gè)地址值所指向的單元中的數(shù)據(jù)送給a。其實(shí)吧,個(gè)人覺(jué)得這個(gè)“*”符號(hào)用得不好,改為“@”可能更讓人容易理解,這個(gè)“@”有“在”的意思,然后我們就可以理解為“把在這個(gè)p值所指向的單元中的值,把它給a”。如果是這樣,很多運(yùn)算公式就很容易理解了,如@p++就是操作“在”p值為地址所指向的單元中的數(shù)據(jù),這個(gè)具體操作就是將其加1,而p++就是p值加1個(gè)數(shù)據(jù)長(zhǎng)度值以將p值變?yōu)橄乱粋(gè)數(shù)據(jù)的地址值(不是地址值本身直接增加1,這個(gè)在后面再解釋?zhuān),也就是說(shuō),只要在p前面加了@,那要操作的對(duì)象就并不是p本身,而是它所指向的單元,這個(gè)一定要牢記不是操作p本身,這樣你在編程時(shí)就不容易出錯(cuò)了。

指針變量是可以直接賦一個(gè)常量值的,但是,這個(gè)值必須是你所要用到的單元的地址值,如果不是,程序編譯時(shí)不會(huì)報(bào)錯(cuò),但程序運(yùn)行時(shí)肯定是亂了,也就是說(shuō),前提是你知道這個(gè)數(shù)據(jù)的絕對(duì)地址值。

接下來(lái)的一個(gè)問(wèn)題,就是指針變量的長(zhǎng)度,既然是表示地址,那它就是一個(gè)沒(méi)有負(fù)號(hào)的整數(shù),其長(zhǎng)度最長(zhǎng)也就是存儲(chǔ)器地址值的長(zhǎng)度,如51機(jī)的RAM,其地址就只有八位,所以,在定義時(shí),它的指針長(zhǎng)度也就一個(gè)單元,多了浪費(fèi)。
還有一個(gè)規(guī)則,指針變量的加減運(yùn)算,是與其所指向的數(shù)據(jù)的長(zhǎng)度綁定的,這個(gè)是在編譯處理時(shí)用到的,意思是其盡管這個(gè)指針變量也是一個(gè)數(shù)據(jù),但它在做加減運(yùn)算時(shí),例如p=p+1,并不是p值直接加1,而是加一個(gè)其所指向的數(shù)據(jù)的長(zhǎng)度址,以直接變?yōu)橄乱粋(gè)數(shù)據(jù)的首地址值,這個(gè)處理,并不是在程序運(yùn)行中進(jìn)行的,而是在編譯時(shí)進(jìn)行的,所以指針變量在使用之前一定要先定義,定義之后,編輯器才會(huì)知道這個(gè)是個(gè)指針變量,然后這樣做處理。
還有一個(gè)教材中沒(méi)說(shuō)清楚的問(wèn)題,這個(gè)所謂的指針,到底是只針對(duì)RAM,還是包括ROM?這個(gè)有興趣的朋友可以研究一下,方法也不難。
以上所說(shuō),其實(shí)都可以用編輯器調(diào)試中的匯編窗口來(lái)證實(shí)。
以上純屬個(gè)人理解,如有錯(cuò)誤與不當(dāng),萬(wàn)請(qǐng)指出。

評(píng)分

參與人數(shù) 2黑幣 +95 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!
xiaoshan7748 + 15 說(shuō)的很通透

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏22 分享淘帖 頂9 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:266429 發(fā)表于 2023-4-20 20:06 | 只看該作者
C的指針問(wèn)題,對(duì)于匯編來(lái)說(shuō),其實(shí)是個(gè)非常簡(jiǎn)單的問(wèn)題,就是用地址值來(lái)尋址的方式。當(dāng)然,在現(xiàn)有的匯編教材中,也沒(méi)有具體的說(shuō)什么用地址值來(lái)來(lái)尋址的這種說(shuō)法,在匯編中,除了立即尋址方式,其它的方式,都是用到地址值的尋址方式。事實(shí)上,只要是用到RAM,就得知道其地址才能進(jìn)行存取操作。
說(shuō)起來(lái),在C中,C的指針的操作,都只是取操作,前面已經(jīng)說(shuō)得很清楚了,其存操作,是由編輯器來(lái)進(jìn)行的,程序員無(wú)權(quán)直接操作。也當(dāng)然,如果程序員知道編輯器的分配規(guī)則,那么程序員想把某數(shù)在編輯器分配時(shí)分配在某單元中,也是可以做到的,這個(gè)就是對(duì)芯片和C通透了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:266429 發(fā)表于 2023-4-20 20:48 | 只看該作者
這個(gè)帖子內(nèi)容,如果配上匯編窗口的實(shí)驗(yàn),應(yīng)該也是一篇不錯(cuò)的文檔吧?
回復(fù)

使用道具 舉報(bào)

地板
ID:266429 發(fā)表于 2023-4-20 21:27 | 只看該作者
知道了指針的原理,那我們完全可以在編程時(shí)很容易地確定任一數(shù)據(jù)的存儲(chǔ)地址,以及任一數(shù)據(jù)中某一字節(jié)的地址,哪怕各數(shù)據(jù)的字節(jié)長(zhǎng)度并不一致。
回復(fù)

使用道具 舉報(bào)

5#
ID:883242 發(fā)表于 2023-4-20 22:04 | 只看該作者
C與匯編有兩個(gè)根本的區(qū)別,造成了C中指針的產(chǎn)生:一個(gè)是數(shù)據(jù)所存儲(chǔ)的地址是由C編輯器自動(dòng)分配的,程序員沒(méi)自主權(quán),所以一個(gè)數(shù)據(jù)存儲(chǔ)的地址,程序員是不知道的;

這話說(shuō)明你的匯編沒(méi)學(xué)好。以Keil C51自帶的A51匯編器為例:

  1. Datum EQU 50h
復(fù)制代碼

這是大部分人常用的把變量Datum定義到50h地址上,嚴(yán)格地說(shuō)是錯(cuò)誤的。正確的寫(xiě)法是這樣:
  1. Datum data 50h
復(fù)制代碼

但是這個(gè)寫(xiě)法把Datum定義到50h地址上,如果是純匯編編程那么沒(méi)有問(wèn)題,如果是匯編和c語(yǔ)言混合編程,這種寫(xiě)法會(huì)和BL51.exe分配內(nèi)存的方法發(fā)生沖突,不會(huì)出現(xiàn)編譯錯(cuò)誤,也不會(huì)出現(xiàn)運(yùn)行錯(cuò)誤,但是可能會(huì)浪費(fèi)RAM空間,不能實(shí)現(xiàn)資源的高效利用。那么最合理的寫(xiě)法是這樣的:
  1. Datum ds 1
復(fù)制代碼
給Datum變量保留一個(gè)字節(jié)的空間,在編譯期間,編譯器也是不知道Datum地址是多少,只有最后連接完成,才能確定,可以查看連接器生成的map文件來(lái)知道Datum的地址到底是幾。


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
IdeaMing + 5

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:401564 發(fā)表于 2023-4-20 22:10 | 只看該作者
純技術(shù)問(wèn)題不要搞這種花里胡哨的東西,對(duì)于學(xué)習(xí)意義不大
什么"老王教你用示波器","七天學(xué)會(huì)單片機(jī)"......之類(lèi)的,往往是沒(méi)什么用的,說(shuō)它不行,它好像有點(diǎn)用,說(shuō)它行,好像用處不大
老外的書(shū)就簡(jiǎn)單,往往枯燥,生澀難懂,但往往能真正的學(xué)到東西,很多時(shí)候能當(dāng)工具書(shū)來(lái)查資料
這是對(duì)指針的描述,幾行代碼,加黑字,很快就能理解指針了


回復(fù)

使用道具 舉報(bào)

7#
ID:8222 發(fā)表于 2023-4-20 22:29 | 只看該作者
這個(gè)更通俗易懂。用@更容易理解,但現(xiàn)在都在用*,干脆就把*當(dāng)@吧。
回復(fù)

使用道具 舉報(bào)

8#
ID:146878 發(fā)表于 2023-4-20 22:36 | 只看該作者
指針的根源是接尋址寄存器,沒(méi)有這個(gè)寄存器的MCU無(wú)法用指針。
回復(fù)

使用道具 舉報(bào)

9#
ID:883242 發(fā)表于 2023-4-20 22:40 | 只看該作者
pdwdzz 發(fā)表于 2023-4-20 22:36
指針的根源是接尋址寄存器,沒(méi)有這個(gè)寄存器的MCU無(wú)法用指針。

有indirect/index register也不好用,比如51強(qiáng)行上指針代碼密度和執(zhí)行效率都是直線下降,得不償失。
回復(fù)

使用道具 舉報(bào)

10#
ID:970057 發(fā)表于 2023-4-21 09:52 | 只看該作者
其實(shí)就是間接尋址方式,給這么多教材解釋得繞來(lái)繞去
回復(fù)

使用道具 舉報(bào)

11#
ID:266429 發(fā)表于 2023-4-21 11:59 | 只看該作者
Y_G_G 發(fā)表于 2023-4-20 22:10
純技術(shù)問(wèn)題不要搞這種花里胡哨的東西,對(duì)于學(xué)習(xí)意義不大
什么"老王教你用示波器","七天學(xué)會(huì)單片機(jī)"......之 ...

我寫(xiě)的是有關(guān)單片機(jī)底層的工作原理和運(yùn)行過(guò)程的東西,是比較接近其本質(zhì)的東西。如果不懂這些,在C中那有些動(dòng)作可能是不知道如何去做的,比如說(shuō),結(jié)合指針操作把一個(gè)四字節(jié)變量中的第三個(gè)字節(jié)的內(nèi)容快速單獨(dú)地讀出來(lái)。
在單片機(jī)運(yùn)行程序中,i=*p,這個(gè)語(yǔ)句執(zhí)行時(shí)操作的數(shù)據(jù)并不是p本身,而是另一個(gè)數(shù)據(jù):這個(gè)數(shù)據(jù)的首地址是p所指向的單元。
指針的本質(zhì)是操作地址,所以,了解單片機(jī)芯片存儲(chǔ)結(jié)構(gòu)及地址之類(lèi)的概念,才能從底層上深入了解指針。
回復(fù)

使用道具 舉報(bào)

12#
ID:883242 發(fā)表于 2023-4-21 12:41 | 只看該作者
真要研究指針,怎么也要找個(gè)正經(jīng)的c語(yǔ)言編譯器吧,如STM32用的三大編譯器IAR、GCC和MDK,找個(gè)天生殘疾的%的不正規(guī)c語(yǔ)言編譯器搞指針是%嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:401564 發(fā)表于 2023-4-21 13:35 | 只看該作者
慢慢思考 發(fā)表于 2023-4-21 11:59
我寫(xiě)的是有關(guān)單片機(jī)底層的工作原理和運(yùn)行過(guò)程的東西,是比較接近其本質(zhì)的東西。如果不懂這些,在C中那有 ...

1: 匯編不需要C指針的功能,用法不一樣
2: 匯編的指針在不同單片機(jī)中,用法是不一樣的,你說(shuō)的只能是8051的匯編,別的匯編用的不是這方法,像PIC的匯編壓根就沒(méi)有像8051這種指針尋址方式,它是由固定文件寄存器來(lái)進(jìn)行操作的,你的說(shuō)法很容易誤導(dǎo)別人
3:C語(yǔ)言很少有人去動(dòng)內(nèi)存,都是由編譯器自動(dòng)分配,閑著沒(méi)事干才會(huì)去動(dòng)內(nèi)存
回復(fù)

使用道具 舉報(bào)

14#
ID:1073144 發(fā)表于 2023-4-21 14:14 | 只看該作者
指針的根源是接尋址寄存器
回復(fù)

使用道具 舉報(bào)

15#
ID:73992 發(fā)表于 2023-4-21 18:49 來(lái)自觸屏版 | 只看該作者
c51地址指針xdat區(qū)是兩個(gè)字節(jié)。變量的值存儲(chǔ)位置是編譯器決定的,但程序員要存儲(chǔ)的值是可以存到指定位置的。開(kāi)機(jī)時(shí)候需要清理64k內(nèi)存,如果沒(méi)有地址指針,程序員就需要寫(xiě)64k行代碼。0000h=0,,,,ffffh=0  .有地址指針只需要地址加一。
回復(fù)

使用道具 舉報(bào)

16#
ID:1073299 發(fā)表于 2023-4-22 15:04 來(lái)自觸屏版 | 只看該作者
一句話,指針就是內(nèi)存地址,然后通過(guò)地址取這個(gè)地址的數(shù)據(jù),說(shuō)一大堆沒(méi)用的云山霧繞的

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
cxxx180 + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

17#
ID:266429 發(fā)表于 2023-4-24 09:42 | 只看該作者
Hephaestus 發(fā)表于 2023-4-20 22:04
C與匯編有兩個(gè)根本的區(qū)別,造成了C中指針的產(chǎn)生:一個(gè)是數(shù)據(jù)所存儲(chǔ)的地址是由C編輯器自動(dòng)分配的,程序員沒(méi) ...

關(guān)于EQU是什么意思有什么用法,看下面一段程序:
  tryy EQU 0A0H
  abyte EQU 0A0H
  abit EQU 0A0H

ORG tryy
START:
   MOV tryy,#tryy
   MOV abyte,#tryy
   MOV C,tryy
   MOV C,abit
DB  1,2,3,4,tryy
ORG 0B0H  
   ddat: ds tryy
   ACALL tryy
END

偽指令EQU如果用于分配存儲(chǔ)單元,那它是用于RAM;偽指令data用于RAM;偽指令ds則是用于ROM。
我的主貼最后有一段話,指針究竟是只針對(duì)RAM,還是包括ROM?
回復(fù)

使用道具 舉報(bào)

18#
ID:883242 發(fā)表于 2023-4-24 12:42 | 只看該作者
慢慢思考 發(fā)表于 2023-4-24 09:42
關(guān)于EQU是什么意思有什么用法,看下面一段程序:
  tryy EQU 0A0H
  abyte EQU 0A0H

老老實(shí)實(shí)看c51的幫助文件吧,你的回復(fù)就沒(méi)有任何正確的地方。

EQU就是簡(jiǎn)單的替換,相當(dāng)于c語(yǔ)言的#define,如果純匯編那么可以用,因?yàn)閮?nèi)存分配完全是你的責(zé)任,發(fā)生沖突也跟編譯器無(wú)關(guān)。如果匯編和c混合編程那么絕對(duì)不可以使用EQU定義變量,因?yàn)檫@么做連接器BL51.exe不知道這些地址已經(jīng)被占用,會(huì)發(fā)成沖突。

ds就是用于RAM,可讀可寫(xiě),用于ROM是很不合理的,讓編譯器分配一個(gè)字節(jié)內(nèi)容未知也不能寫(xiě)的ROM你想干什么?
回復(fù)

使用道具 舉報(bào)

19#
ID:266429 發(fā)表于 2023-4-24 15:05 | 只看該作者
Hephaestus 發(fā)表于 2023-4-24 12:42
老老實(shí)實(shí)看c51的幫助文件吧,你的回復(fù)就沒(méi)有任何正確的地方。

EQU就是簡(jiǎn)單的替換,相當(dāng)于c語(yǔ)言的#defi ...

北航2012年出版的《單片機(jī)系統(tǒng)設(shè)計(jì)基礎(chǔ)》中強(qiáng)調(diào)DS及DW只能用于程序存儲(chǔ)器,不能用于數(shù)據(jù)存儲(chǔ)器,這是目前我找到的唯一說(shuō)明了DS應(yīng)用存儲(chǔ)目標(biāo)的書(shū)。
我的其它的錯(cuò)誤,還是希望一條條地說(shuō)明,有討論就會(huì)有進(jìn)步。DS在編程中有什么實(shí)際用途,的確如你所說(shuō),本人也困惑。
回復(fù)

使用道具 舉報(bào)

20#
ID:709761 發(fā)表于 2023-4-24 16:12 | 只看該作者
編程這么久了,也沒(méi)感覺(jué)到指針有多么厲害
回復(fù)

使用道具 舉報(bào)

21#
ID:883242 發(fā)表于 2023-4-24 18:28 | 只看該作者
慢慢思考 發(fā)表于 2023-4-24 15:05
北航2012年出版的《單片機(jī)系統(tǒng)設(shè)計(jì)基礎(chǔ)》中強(qiáng)調(diào)DS及DW只能用于程序存儲(chǔ)器,不能用于數(shù)據(jù)存儲(chǔ)器,這是目前 ...

你直接看Keil自帶的幫助文件好了,中文的資料都是%為了晉升%灌水出來(lái)的,毫無(wú)價(jià)值的%。
回復(fù)

使用道具 舉報(bào)

22#
ID:1074328 發(fā)表于 2023-4-26 23:16 | 只看該作者
很少有人把這個(gè)講的這么好了
回復(fù)

使用道具 舉報(bào)

23#
ID:888585 發(fā)表于 2023-4-27 08:34 | 只看該作者
題主講的不錯(cuò),對(duì)于初學(xué)者來(lái)說(shuō)是很有用的
回復(fù)

使用道具 舉報(bào)

24#
ID:402993 發(fā)表于 2023-4-27 20:15 | 只看該作者
講得很明細(xì)。
回復(fù)

使用道具 舉報(bào)

25#
ID:291668 發(fā)表于 2023-4-28 13:26 | 只看該作者
爭(zhēng)論的焦點(diǎn)就是指針的用途。我理解指針就像上學(xué)時(shí)的樓管阿姨,手里有一大串鑰匙,對(duì)應(yīng)每個(gè)宿舍門(mén),至于里邊住幾個(gè)人,從哪里來(lái)的。她不關(guān)心。只要找到能打開(kāi)這扇門(mén)的鑰匙就行了。
回復(fù)

使用道具 舉報(bào)

26#
ID:689425 發(fā)表于 2023-5-4 09:26 | 只看該作者
li64331218 發(fā)表于 2023-4-28 13:26
爭(zhēng)論的焦點(diǎn)就是指針的用途。我理解指針就像上學(xué)時(shí)的樓管阿姨,手里有一大串鑰匙,對(duì)應(yīng)每個(gè)宿舍門(mén),至于里邊 ...

很形象
回復(fù)

使用道具 舉報(bào)

27#
ID:721848 發(fā)表于 2023-5-10 11:53 | 只看該作者
比較難懂,不好理解
回復(fù)

使用道具 舉報(bào)

28#
ID:1079700 發(fā)表于 2023-5-24 21:59 | 只看該作者
講的很好
回復(fù)

使用道具 舉報(bào)

29#
ID:1083793 發(fā)表于 2023-6-13 14:12 | 只看該作者
講的很清楚,新手可以看一看。
回復(fù)

使用道具 舉報(bào)

30#
ID:333446 發(fā)表于 2023-7-12 11:57 | 只看該作者
c語(yǔ)言引入指針是為了程序設(shè)計(jì)簡(jiǎn)單,因?yàn)閏pu里可以間接尋址,這樣在類(lèi)似查表之類(lèi)的操作時(shí),直接把間接尋址寄存器加減相應(yīng)的值就行了。可以快速取得數(shù)據(jù)地址。
回復(fù)

使用道具 舉報(bào)

31#
ID:73833 發(fā)表于 2023-7-19 14:51 | 只看該作者
指針就是鐘表上的指針,指向哪里就可表示出哪里的數(shù)字。比如,指針指向3點(diǎn)鐘那里(存放3這個(gè)數(shù)據(jù)的地址),人們就知道是3點(diǎn)(3,就是存放3 de地址里 de 數(shù)據(jù))
回復(fù)

使用道具 舉報(bào)

32#
ID:73833 發(fā)表于 2023-7-19 14:52 | 只看該作者
wydev 發(fā)表于 2023-4-22 15:04
一句話,指針就是內(nèi)存地址,然后通過(guò)地址取這個(gè)地址的數(shù)據(jù),說(shuō)一大堆沒(méi)用的云山霧繞的

言簡(jiǎn)意賅
回復(fù)

使用道具 舉報(bào)

33#
ID:475306 發(fā)表于 2023-7-28 08:47 | 只看該作者
wydev 發(fā)表于 2023-4-22 15:04
一句話,指針就是內(nèi)存地址,然后通過(guò)地址取這個(gè)地址的數(shù)據(jù),說(shuō)一大堆沒(méi)用的云山霧繞的

都快讓他們搞蒙了,剛?cè)雽W(xué)
回復(fù)

使用道具 舉報(bào)

34#
ID:123289 發(fā)表于 2023-8-25 15:49 | 只看該作者
【北航2012年出版的《單片機(jī)系統(tǒng)設(shè)計(jì)基礎(chǔ)》中強(qiáng)調(diào)DS及DW只能用于程序存儲(chǔ)器,不能用于數(shù)據(jù)存儲(chǔ)器】
個(gè)人不同意這個(gè)說(shuō)法。
回復(fù)

使用道具 舉報(bào)

35#
ID:1096033 發(fā)表于 2023-10-18 10:20 | 只看該作者
解釋的挺好
回復(fù)

使用道具 舉報(bào)

36#
ID:1098507 發(fā)表于 2023-11-5 13:18 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

37#
ID:1105351 發(fā)表于 2023-12-20 13:56 | 只看該作者
看懂啦!感謝樓主
回復(fù)

使用道具 舉報(bào)

38#
ID:1088185 發(fā)表于 2024-1-6 17:19 | 只看該作者
也許從應(yīng)用倒過(guò)來(lái)理解"為什么要用指針"更加容易讓你了解指針。

比如就不讓你用指針寫(xiě)C代碼, 可以嗎?
不用指針的話有什么功能是做不到的?
有什么功能不給你用指針做就效率大大的降低?

能正確的回答以上問(wèn)題,你才算懂指針是個(gè)啥玩意兒。
回復(fù)

使用道具 舉報(bào)

39#
ID:311731 發(fā)表于 2024-2-4 18:47 | 只看該作者
東莞朋友 發(fā)表于 2023-4-21 09:52
其實(shí)就是間接尋址方式,給這么多教材解釋得繞來(lái)繞去

就是匯編語(yǔ)言的間接尋址
回復(fù)

使用道具 舉報(bào)

40#
ID:123036 發(fā)表于 2024-2-5 10:35 | 只看該作者
wydev 發(fā)表于 2023-4-22 15:04
一句話,指針就是內(nèi)存地址,然后通過(guò)地址取這個(gè)地址的數(shù)據(jù),說(shuō)一大堆沒(méi)用的云山霧繞的

同意。一大堆去說(shuō)間接/尋址/寄存器。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表