|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于指針和數(shù)組請教大家,幫我一下,急死我了,謝謝。 |
| 作者:FZJ 欄目:單片機 |
我要定義一個數(shù)組,這個數(shù)組中有10個元素,每個元素都要指向一個變量,比如:unsingned CHAR a[10]; //一個包含有10個元素的數(shù)組 unsingned CHAR a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;//10個變量 a[1]=a1;a[2]=a2;a[3]=a3;......... 大家?guī)臀铱纯矗@樣的數(shù)組我該如何寫,我是想讀EEPROM的10字節(jié)數(shù)據(jù)保存到數(shù)組中,謝謝!另外請大家看看下面的最簡單的指針用法可是怎么不管用??? #include <pic.h> unsigned CHAR a,*p; void main() { *p=&a; for(;;) { ++*p; } } 希望知道的幫幫我,謝謝拉! |
| 2樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/18 14:29:00 發(fā)布:
第1個問題沒看懂 第2個問題,*p=&a;的意思是:把a的地址送p指向的地址,而在此之前,p并沒有初始化。按你的程序猜,應(yīng)該改成 p=&a; //初始化p |
|
| 3樓: | >>參與討論 |
| 作者: computer00 于 2006/1/18 15:00:00 發(fā)布:
第一個問題我也沒看懂。 p是指針(即地址),*p則是p指向地址中的內(nèi)容。 所以應(yīng)該將a的地址放入p中,即: p=&a; 然后使用*p,就相當于訪問a了。 |
|
| 4樓: | >>參與討論 |
| 作者: fzj 于 2006/1/18 18:29:00 發(fā)布:
楊工 和熱心的computer00老師,謝謝! 我第一個問題的意思是一般來將數(shù)組有字符數(shù)組,常量數(shù)組等,但是我的數(shù)組要組合變量,變量的意思是組合RAM,像常量數(shù)組如:A[]={1,2,3,4,5,6,7,8,9,10} 但是我要把常量1~10變成10個變量(RAM)也就是說A[]={RAM1~RAM10}因為我要讀EEPROM的10個地址,也就是10個字節(jié)的內(nèi)容放到10個RAM中,在C語言中通用RAM沒有明確的地址,除非你明確定義,我的意思是用一個數(shù)組組合10個變量(RAM)然后通過指針去調(diào)用10個RAM,從而完成EEPROM10個字節(jié)的讀取,希望能再幫幫我,非常的感謝! 第2個問題我按您們的方法也試了,不行,奇怪的是我把它做成一個函數(shù)卻可以看看: unsigned CHAR a; void b (unsigned CHAR *p) { ++*p; } void main() { for (;;) { b(&a); } } 以上是可以完成變量a+1操作的,但是在主函數(shù)中直接就不行,不知道是為什么??? |
|
| 5樓: | >>參與討論 |
| 作者: fzj 于 2006/1/18 18:52:00 發(fā)布:
不知道我說的是否看的懂?如果還不懂請看看 void randomRead(CHAR addr,CHAR counter,CHAR *p) { BSTART(); byteTrans(0xa0); // slave addr write byteTrans(addr); BSTART(); byteTrans(0xa1); for(;counter!=0;counter--) { *p=byteReceive(); p++; if(counter>1) BITOUT(0); } BSTOP(); } 以上是一個讀EEPROM的函數(shù),數(shù)據(jù)放到指針P中,也就是P所指向的地址,這個地址可以確定,也就是我在主函數(shù)調(diào)用時可以這樣寫 randomRead(1,10,&a);//第一個1是EEPROM地址01H,第2個10是我要連續(xù)讀取從1開始的10個地址數(shù)據(jù),最后一個就是要保存的地址.但是一句++P;也就是a地址加1后,我就不知道這個地址的具體名字,所以我要用數(shù)組來組合變量,這樣就知道它的具體名字,通過P指向一個數(shù)組的第一位,++P也就肯定是第2位了...不知道您明白了么??? 謝謝了computer00老師 和楊工!!!!!!! |
|
| 6樓: | >>參與討論 |
| 作者: sir_h 于 2006/1/18 19:35:00 發(fā)布:
你的錯誤在于你對指針的不熟悉 要實現(xiàn)這個功能: unsigned CHAR a; void b (unsigned CHAR *p) { ++*p; } void main() { for (;;) { b(&a); } } 只需將你主函數(shù)改一下如: #include <pic.h> unsigned CHAR a,*p; void main() { p=&a; for(;;) { ++*p; } } 你的RAM0,RAM1,RAM2的實現(xiàn)可以通過這個方法: CHAR ram0; CHAR ram1; CHAR ram2; CHAR * code pram[]={&ram0,&ram1,&ram2}; void randomRead(CHAR addr,CHAR counter,CHAR * * p) { BSTART(); byteTrans(0xa0); // slave addr write byteTrans(addr); BSTART(); byteTrans(0xa1); for(;counter!=0;counter--) { * * p=byteReceive(); p++; if(counter>1) BITOUT(0); } BSTOP(); } 調(diào)用時如: randomRead(0,3,pram); * - 本貼最后修改時間:2006-1-20 11:49:36 修改者:sir_h |
|
| 7樓: | >>參與討論 |
| 作者: computer00 于 2006/1/18 19:50:00 發(fā)布:
暈了,怎么會不行呢? 問題1: void main(void) { unsigned CHAR *p; unsigned CHAR a; p=&a; ++(*p); //這條語句相當于 ++a } 問題2: unsigned CHAR your_data[10]; //聲明一個數(shù)組,用來保存讀回的數(shù) void main(void) { randomRead(1,10,your_data); //或者寫成 randomRead(1,10,&(your_data[0])); } |
|
| 8樓: | >>參與討論 |
| 作者: mikejx 于 2006/1/18 23:12:00 發(fā)布:
p=(&a); |
|
| 9樓: | >>參與討論 |
| 作者: 楊工 于 2006/1/18 23:20:00 發(fā)布:
第1個問題還是看不懂,只能猜了。 你的意思是不是說,在EEPROM里保存了一個結(jié)構(gòu)? 舉個例子: struct TIME //8字節(jié) { UCHAR Hour; // 時,BCD格式, 0x00-0x59 UCHAR Minute; // 分,BCD格式, 0x00-0x59 UCHAR Second; // 秒,BCD格式, 0x00-0x59 }Time; 從EEPROM里讀出這個結(jié)構(gòu) randomRead(addr,counter,&Time); 然后就可以引用了: a = Time.Hour; b = Time.Minute; c = Time.Second; * - 本貼最后修改時間:2006-1-18 23:21:23 修改者:楊工 |
|
| 10樓: | >>參與討論 |
| 作者: big_ben 于 2006/1/18 23:36:00 發(fā)布:
我想這大概就是你所要的 unsigned CHAR a[10]; void randomRead(CHAR addr,CHAR counter,unsigned CHAR *p) { BSTART(); byteTrans(0xa0); // slave addr write byteTrans(addr); BSTART(); byteTrans(0xa1); for(;counter!=0;counter--) { p[counter]=byteReceive(); if(counter>1) BITOUT(0); } BSTOP(); } main() { randomRead(1,10,a); //調(diào)用randomRead()函數(shù),將EEPROM中10 //字節(jié)內(nèi)容讀入數(shù)組a[] . . . . } //a[9]是讀到的第一個字節(jié),a[0]是讀到的最后一個字節(jié) |
|
| 11樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 8:20:00 發(fā)布:
謝謝大家,謝謝!昨晚又試了一下然后又溫習了指針 第1個問題解決了,原來是我粗心的緣故,把*P=&a寫成P=a了,寫對了一個卻又寫錯了一個,仔細看了一下書,電腦圈圈老師說的對.謝謝! 第2個問題正如SIR_H所說我對指針的不理解,其實我對數(shù)組也不太理解 我想是不是可以這么寫: unsigned CHAR *p,a[10],b; void main() { p=a; //指針地址指向數(shù)組a ,p=&a ++*p; //數(shù)組a加1 PORTB=a[b]; //調(diào)用數(shù)組到PORTB,這樣對么? } 謝謝大家! |
|
| 12樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/1/19 8:43:00 發(fā)布:
上面寫的程序沒看明白 怎么又是數(shù)組、又是指針,后來又用數(shù)組輸出???用指針的目的就是可以更加靈活,指針可以代替數(shù)組的,我覺得最后一句可以用指針寫,否則你定義指針干什么 |
|
| 13樓: | >>參與討論 |
| 作者: computer00 于 2006/1/19 9:09:00 發(fā)布:
數(shù)組名其實就是指針 而[]就是變址尋址。 例如: unsigned CHAR a[10]; //a[]有10個單元,訪問時使用a[0],a[1] ... a[9],相當于10個變量 a[0]=1; //也可以這么寫 *a=1; a[1]=1; //也可以這么寫 *(a+1)=1; a[5]=2; //也可以這么寫 *(a+5)=2; unsigned CHAR * p; p=a; // or p=&(a[0]); *(p+3)=2; //也可以這么寫 p[3]=2; 這跟用 *(a+3)=2;或a[3]=2;是同樣的效果。 * - 本貼最后修改時間:2006-1-19 9:14:12 修改者:computer00 |
|
| 14樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 10:09:00 發(fā)布:
謝謝大家,還有一個EEPROM的問題請教,謝謝! 書上說EEPROM在讀過程中ACK應(yīng)答信號是由主器件發(fā)出,也就是單片機主動產(chǎn)生一個下降沿,作為ACK應(yīng)答信號, 在寫過程中ACK應(yīng)答信號由從器件發(fā)出,也就是主器件(mcu)接收ACK應(yīng)答信號,我想如果從器件沒有發(fā)出ACK,那單片機該做怎樣處理(等待還是STOP錯誤處理?) 在連續(xù)寫過程中寫完一個字節(jié)后必須查詢等待,即查詢ACK應(yīng)答信號是否為0,(讀操作不需要對么?) 希望大家再幫幫忙,感激不盡!(楊工:上次您給我說EEPROM的事我看了還是有點不明白,麻煩您再看看。 由于小弟剛開始接觸EEPROM所以請知道的老師指點一二,非常感謝! |
|
| 15樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 11:50:00 發(fā)布:
大家再幫我看看呀!謝謝拉 |
|
| 16樓: | >>參與討論 |
| 作者: su_mj000 于 2006/1/19 13:15:00 發(fā)布:
"數(shù)組名其實就是指針"? 我覺得這句話有問題. 也許,在某些編譯中,下述的語句是合法的: unsigned CHAR a[10]; ... *a=1; *(a+1)=1; *(a+5)=2; 但決不能允許諸如 a = (unsigned CHAR *)0x0000; 因為這里的a只是一個地址常數(shù)而非變量. |
|
| 17樓: | >>參與討論 |
| 作者: computer00 于 2006/1/19 13:44:00 發(fā)布:
哦,是我當時說的時候沒留意,數(shù)組名其實是指針常量 但數(shù)組名,本質(zhì)上是指針,這句話是對的。只不過它是指針常量,故不能重新賦值了。 相應(yīng)的,還有指針變量。指針變量就可以重新賦值。 如: unsigned CHAR * p; p=(unsigned CHAR *)0; *p=2; p[3]=2; //相當于 *(p+3)=2; |
|
| 18樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 15:57:00 發(fā)布:
電腦圈圈大哥:您知道EEPROM么? 幫我看看我的思路對不? 書上說EEPROM在讀過程中ACK應(yīng)答信號是由主器件發(fā)出,也就是單片機主動產(chǎn)生一個下降沿,作為ACK應(yīng)答信號, 在寫過程中ACK應(yīng)答信號由從器件發(fā)出,也就是主器件(mcu)接收ACK應(yīng)答信號,我想如果從器件沒有發(fā)出ACK,那單片機該做怎樣處理(等待還是STOP錯誤處理?) 在連續(xù)寫過程中寫完一個字節(jié)后必須查詢等待,即查詢ACK應(yīng)答信號是否為0,(讀操作不需要對么?) |
|
| 19樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 16:04:00 發(fā)布:
怎么就不能組合已聲明的變量??? unsigned CHAR s1,s2,s3,s4; unsigned CHAR writedata[]={s1,s2,s3,s4}; 大蝦再幫俺一下,謝謝,謝謝,謝謝。! |
|
| 20樓: | >>參與討論 |
| 作者: computer00 于 2006/1/19 16:40:00 發(fā)布:
如果等不到ACK,那就發(fā)停止條件(其實你這個是I2C總線問題) 組合?何來的組合?你是想把s1-s4的值,放到數(shù)組中嗎?還是說,通過數(shù)組,就可以訪問到s1-s4的值??? 如果是前者,該這么干: unsigned CHAR s1,s2,s3,s4; unsigned CHAR writedata[4]; writedata[0]=s1; writedata[1]=s2; writedata[2]=s3; writedata[3]=s4; 如果是后者,應(yīng)該這么干: unsigned CHAR s1,s2,s3,s4; unsigned CHAR * writedata[4]; //聲明一個指針數(shù)組 //指針初始化,分別指向s1-s4 writedata[0]=&s1; writedata[1]=&s2; writedata[2]=&s3; writedata[3]=&s4; *(writedata[0])=55; //相當于訪問 s1 *(writedata[1])=55; //相當于訪問 s2 something=*(writedata[2]); //相當于 something=s3; |
|
| 21樓: | >>參與討論 |
| 作者: FZJ 于 2006/1/19 18:12:00 發(fā)布:
謝謝computer00 大哥,嘿嘿!我的意思是... S1-S4可以獨立訪問也可以通過指針訪問.您所說的前者可以這樣么?像 S1=0XAA; B=a[0];//B=S1=0XAA; 謝謝大哥,您幫了小弟好多的忙,可是小弟卻沒能力幫您,小弟熟悉一點PCB設(shè)計,如果大哥需要,小弟可以為大哥設(shè)計電路以求報答大哥,希望大哥有機會能讓小弟回報您一點! |
|
| 22樓: | >>參與討論 |
| 作者: computer00 于 2006/1/19 18:37:00 發(fā)布:
暈,別說得那么嚴重。 如果你的目的是這樣,方法一不行,必須用方法二。 unsigned CHAR s1,s2,s3,s4; unsigned CHAR * writedata[4]; //聲明一個指針數(shù)組 //指針初始化,分別指向s1-s4 writedata[0]=&s1; writedata[1]=&s2; writedata[2]=&s3; writedata[3]=&s4; *(writedata[0])=55; //相當于s1=55; *(writedata[1])=55; //相當于s2=55; something=*(writedata[2]); //相當于 something=s3; 有一點我想不明白,為啥要搞個s1-s4出來???直接聲明一個數(shù)組,不就行了? 例如,unsigned CHAR your_data[4]; 把原來用s1的地方,改成your_data[0], s2-s4按照同樣的方法使用,有什么不好的嗎??? 或者干脆來個宏定義: unsigned CHAR your_data[4] #define s1 (your_data[0]) #define s2 (your_data[1]) #define s3 (your_data[2]) #define s4 (your_data[4]) 這樣不是很省事么?也節(jié)省RAM。 |
|
| 23樓: | >>參與討論 |
| 作者: hotpower 于 2006/1/19 18:41:00 發(fā)布:
暈到~~~這個問題竟如此復(fù)雜??? |
|
| 24樓: | >>參與討論 |
| 作者: fzj 于 2006/1/20 8:16:00 發(fā)布:
多謝大哥的指導(dǎo)。我試了您的方法,非常的好 哈哈原來就用宏定義可以解決,這么簡單,我卻怎么也想不到。呵呵,謝謝! 不過大哥也馬虎了 unsigned CHAR your_data[4] //定義數(shù)組應(yīng)該以“;”結(jié)束呀。 #define s1 (your_data[0]) #define s2 (your_data[1]) #define s3 (your_data[2]) #define s4 (your_data[4]) //數(shù)組中只帶4個變量應(yīng)該是0-3,不過我知道大哥的意思,謝謝! |
|
| 25樓: | >>參與討論 |
| 作者: computer00 于 2006/2/5 18:27:00 發(fā)布:
哦,那是筆誤,另外括號是多余的,匆忙打上來的,沒留意 unsigned CHAR your_data[4]; #define s1 your_data[0] #define s2 your_data[1] #define s3 your_data[2] #define s4 your_data[3] |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |