音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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 欄目:單片機
關(guān)于指針和數(shù)組請教大家,幫我一下,急死我了,謝謝!
我要定義一個數(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樓: >>參與討論
楊工
第1個問題沒看懂
第2個問題,*p=&a;的意思是:把a的地址送p指向的地址,而在此之前,p并沒有初始化。按你的程序猜,應(yīng)該改成
p=&a;  //初始化p



3樓: >>參與討論
computer00
第一個問題我也沒看懂。
p是指針(即地址),*p則是p指向地址中的內(nèi)容。

所以應(yīng)該將a的地址放入p中,即:

p=&a;

然后使用*p,就相當于訪問a了。

4樓: >>參與討論
fzj
楊工 和熱心的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
不知道我說的是否看的懂?如果還不懂請看看
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
你的錯誤在于你對指針的不熟悉
要實現(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
暈了,怎么會不行呢?
問題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
p=(&a);
 
9樓: >>參與討論
楊工
第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
我想這大概就是你所要的
    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
謝謝大家,謝謝!昨晚又試了一下然后又溫習了指針
第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樓: >>參與討論
夏蟲
上面寫的程序沒看明白
怎么又是數(shù)組、又是指針,后來又用數(shù)組輸出???用指針的目的就是可以更加靈活,指針可以代替數(shù)組的,我覺得最后一句可以用指針寫,否則你定義指針干什么

13樓: >>參與討論
computer00
數(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
謝謝大家,還有一個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
大家再幫我看看呀!謝謝拉
 
16樓: >>參與討論
su_mj000
"數(shù)組名其實就是指針"?
我覺得這句話有問題.

也許,在某些編譯中,下述的語句是合法的:

unsigned CHAR a[10];
...

*a=1;
*(a+1)=1;
*(a+5)=2;

但決不能允許諸如

a = (unsigned CHAR *)0x0000;

因為這里的a只是一個地址常數(shù)而非變量.



17樓: >>參與討論
computer00
哦,是我當時說的時候沒留意,數(shù)組名其實是指針常量
但數(shù)組名,本質(zhì)上是指針,這句話是對的。只不過它是指針常量,故不能重新賦值了。


相應(yīng)的,還有指針變量。指針變量就可以重新賦值。

如: unsigned CHAR * p;
     p=(unsigned CHAR *)0;
     *p=2;
     p[3]=2;  //相當于 *(p+3)=2;

18樓: >>參與討論
FZJ
電腦圈圈大哥:您知道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
怎么就不能組合已聲明的變量???
unsigned CHAR s1,s2,s3,s4;
unsigned CHAR writedata[]={s1,s2,s3,s4};
大蝦再幫俺一下,謝謝,謝謝,謝謝。!

20樓: >>參與討論
computer00
如果等不到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
謝謝computer00 大哥,嘿嘿!我的意思是...
S1-S4可以獨立訪問也可以通過指針訪問.您所說的前者可以這樣么?像
S1=0XAA;
B=a[0];//B=S1=0XAA;
謝謝大哥,您幫了小弟好多的忙,可是小弟卻沒能力幫您,小弟熟悉一點PCB設(shè)計,如果大哥需要,小弟可以為大哥設(shè)計電路以求報答大哥,希望大哥有機會能讓小弟回報您一點!

22樓: >>參與討論
computer00
暈,別說得那么嚴重。
如果你的目的是這樣,方法一不行,必須用方法二。


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
暈到~~~這個問題竟如此復(fù)雜???
 
24樓: >>參與討論
fzj
多謝大哥的指導(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
哦,那是筆誤,另外括號是多余的,匆忙打上來的,沒留意
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]


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
at89c51復(fù)位引腳直接接地可以嗎?
在校大專生的困惑!
提供嵌入式以太網(wǎng)開發(fā)套件,支持DHCP/UDP/ICMP/IP/ARP/ET....
嵌入式以太網(wǎng)開發(fā)套件使用手冊
總理解不了中斷,前輩們請指教
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號