|
發布時間: 2020-8-3 09:41
正文摘要:我的目的是在數據數組中存放著一組數據,然后通過另一個數組所謂索引儲存著數據數組的地址,然后在主函數中只需要通過指針訪問索引中的數據數組的地址就可以獲得數據。 麻煩大神幫忙找下問題點,提供點思路 ////// ... |
| 修改索引數組數據類型,索引數據類型改為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); } |
| 定義指針變量就可以查數組元素了 |
|
那個中斷中的P10和P11那句請忽略 |
|
你這樣用指針就把你的程序玩壞了。 unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned char *pAddr; 如果讓pAddr = &dat[0]; 那么*pAddr和pAddr[0]則為0x11; 如果繼續進行如下操作:pAddr++; 那么*pAddr和pAddr[0]則為0x22; 如果此時重新給指針賦值:pAddr = &dat[3]; 那么*pAddr和pAddr[0]則為0x44; 如果繼續進行如下操作:pAddr--; 那么*pAddr和pAddr[0]則為0x33; 且*(pAddr+1)和pAddr[1]則為0x44; 總結:將指針指向某個數組地址后,該指針則存儲其對應數組的起始地址,指針如果增加或者減小,它存儲的地址就相應的偏移,且偏移的大小由指針定義時的類型來決定。我們這個例子是uchar型,所以是8bit。我們隨時可以用*或者數組的方式從對應的地址取出數據。取出數據的寬度是指針類型的寬度,與數組無關。 例如: 對于32位的單片機: unsigned char code dat[4]={0x11, 0x22, 0x33, 0x44}; unsigned int *pAddr; 那么pAddr[0]或者*pAddr的值是多少呢? 在小端模式下:答案是0x44332211 在小端模式下:答案是0x11223344 你可以測試一下 51是什么模式。 |