![]() |
發(fā)布時間: 2020-8-3 09:41
正文摘要:我的目的是在數(shù)據(jù)數(shù)組中存放著一組數(shù)據(jù),然后通過另一個數(shù)組所謂索引儲存著數(shù)據(jù)數(shù)組的地址,然后在主函數(shù)中只需要通過指針訪問索引中的數(shù)據(jù)數(shù)組的地址就可以獲得數(shù)據(jù)。 麻煩大神幫忙找下問題點,提供點思路 ////// ... |
修改索引數(shù)組數(shù)據(jù)類型,索引數(shù)據(jù)類型改為32位 |
已解決 #include "reg51.h" #include "intrins.h" //測試工作頻率為11.0592MHz unsigned int dat[4]={0xb5b5,0xb5b6,0xb5b7,0xb5b8}; long code address[1]={&dat}; int num[4]; sfr T2L = 0xd7; sfr T2H = 0xd6; sfr AUXR = 0x8e; void UART1_init() { SCON = 0x50; T2L = 0xe8; //65536-11059200/115200/4=0FFE8H T2H = 0xff; AUXR = 0x15; //啟動定時器 ES = 1; //使能串口中斷 EA = 1; } void UART1_Interrupt() interrupt 4 { if (TI) { TI = 0; //清中斷標志 } if (RI) { RI = 0; //清中斷標志 } } void main() { unsigned int i; unsigned int *addr; UART1_init(); addr=address[0]; for(i=0;i<4;i++) { num[i]=*addr;//將address中儲存的地址賦給j addr++; } while (1); } |
參與人數(shù) 1 | 黑幣 +30 | 收起 理由 |
---|---|---|
![]() | + 30 | 回帖助人的獎勵! |
定義指針變量就可以查數(shù)組元素了 |
那個中斷中的P10和P11那句請忽略 |
你這樣用指針就把你的程序玩壞了。 unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned char *pAddr; 如果讓pAddr = &dat[0]; 那么*pAddr和pAddr[0]則為0x11; 如果繼續(xù)進行如下操作:pAddr++; 那么*pAddr和pAddr[0]則為0x22; 如果此時重新給指針賦值:pAddr = &dat[3]; 那么*pAddr和pAddr[0]則為0x44; 如果繼續(xù)進行如下操作:pAddr--; 那么*pAddr和pAddr[0]則為0x33; 且*(pAddr+1)和pAddr[1]則為0x44; 總結:將指針指向某個數(shù)組地址后,該指針則存儲其對應數(shù)組的起始地址,指針如果增加或者減小,它存儲的地址就相應的偏移,且偏移的大小由指針定義時的類型來決定。我們這個例子是uchar型,所以是8bit。我們隨時可以用*或者數(shù)組的方式從對應的地址取出數(shù)據(jù)。取出數(shù)據(jù)的寬度是指針類型的寬度,與數(shù)組無關。 例如: 對于32位的單片機: unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned int *pAddr; 那么pAddr[0]或者*pAddr的值是多少呢? 在小端模式下:答案是0x44332211 在小端模式下:答案是0x11223344 你可以測試一下 51是什么模式。 |
參與人數(shù) 1 | 黑幣 +40 | 收起 理由 |
---|---|---|
![]() | + 40 | 回帖助人的獎勵! |