一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3400|回复: 14

[51单片机] 哪位老师能给举个例子,讲讲C语言的指针

[复制链接]
发表于 2014-8-29 09:31 | 显示全部楼层 |阅读模式
这个指针看了好多书,还是晕晕乎乎的
能不能写一个简单的例子,实际运用一下

比如,通过数码管的数组,显示的时候用上指针

 楼主| 发表于 2014-8-29 09:34 | 显示全部楼层
本帖最后由 gw168sh 于 2014-8-29 09:39 编辑

#include<reg52.h>
unsigned char code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code table[]={2,3,4,5,6,7,8,9};
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void main(void)
{
  uchar i;        //声明一个变量 i
  uchar  *p;   //声明一个指针P
while(1)
   {
        for(i=0;i<7;i++)
         {
           P0=smg_du[*p];
           p++;
           P2=smg_we;
           delay_50us(6);
          }
     }
//while_END
}//main_END


这个程序网上找的,貌似有点问题
回复

使用道具 举报

发表于 2014-8-29 09:39 | 显示全部楼层
上面的程序有问题,指针P没有赋值就使用了,后果不可预料
回复

使用道具 举报

发表于 2014-8-29 10:17 来自手机 | 显示全部楼层
指针 指针:是一个地址,通俗来说就是数据存储的地方。 指针变量(经常被人误称为指针):就是一个变量,用指针变量来装指针。 例: int n;//声明一个整形变量 int *p;//声明一个指针变量 p=&n;//取n的指针,放到指针变量p里 *p = 0;//p指向的变量赋值为0,等价于 n=0;
回复

使用道具 举报

发表于 2014-8-29 10:53 | 显示全部楼层
使用数组的时候,其实你就是用的指针了.


u8 a[8];
u8 b=&a[0] ;
或 u8 b=a;

a[] ~a[7]
就对应
*b ~ *(b+7)
不同的是声明 a[8]时,就开辟了8个字节的变量.
而 声明
u8 *a;
只声明了一个字节的变量, 这样在使用的时候容易破坏未知的RAM区域.

(很久没温习了不知道说得对不对)
指针使用起来很灵活,但也容易出问题.在使用的时候一定要规范. 不要定义空指针,谨防溢出.

建议去看看<C和指针>这本书.
看书还是得实体书哪.
回复

使用道具 举报

发表于 2014-8-29 10:59 | 显示全部楼层
junyee 发表于 2014-8-29 10:53
使用数组的时候,其实你就是用的指针了.


这不对吧,应该是
u8 a[8];
u8 *b=&a[0] ;
或 u8 *b=a;
回复

使用道具 举报

发表于 2014-8-29 12:43 | 显示全部楼层
本帖最后由 junyee 于 2014-8-29 12:46 编辑

不好意思是错了.
u8 a[8];
u8 *b= a[0] ;
u8 *b=a; 这句也错了

u8 *b;
b=a;
或 u8 *b = *a;

回复

使用道具 举报

发表于 2014-8-29 13:23 | 显示全部楼层
指针这个,还真没有什么好办法一下子讲清楚的,要自己去看自己去研究
回复

使用道具 举报

 楼主| 发表于 2014-8-29 15:55 | 显示全部楼层
本帖最后由 gw168sh 于 2014-8-29 15:56 编辑
chjj0 发表于 2014-8-29 10:17
指针 指针:是一个地址,通俗来说就是数据存储的地方。 指针变量(经常被人误称为指针):就是一个变量,用 ...

指针 指针:是一个地址,通俗来说就是数据存储的地方。 指针变量(经常被人误称为指针):就是一个变量,用指针变量来装指针。
例:
int n;       //声明一个整形变量
int *p;     //声明一个指针变量
p=&n;     //取n的指针,放到指针变量p里
*p = 0;   //p指向的变量赋值为0,等价于 n=0;


//unsigned char code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void)
{
  uchar i;                    // 声明一个变量 i

  uchar  *p;                //声明一个指针变量 P
  p=&smg_we[] ;       // 取 smg_we[]  的指针,放到指针变量p里
  *p=0;                     //p指向的变量赋值为0;
while(1)
   {
           P0= smg_we[*p];      //位选 。第一次执行P0=0xfe   ,第二次循环P0=0xfd   第三次循P0=0xfb
           p++;                        // 地址加一
           if(p>7) p=0;              //如果P大于7 从0开始
           P2= smg_du;         //显示笔段,这里只是假设 ,不考虑显示效果。
           delay_50us(60000);
     }//while_END
}//main_END

这样行不行,还有什么问题?

回复

使用道具 举报

 楼主| 发表于 2014-8-29 15:57 | 显示全部楼层
junyee 发表于 2014-8-29 10:53
使用数组的时候,其实你就是用的指针了.


谢谢指点,
刚才已经在淘宝上买了这本书了
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-31 12:26 , Processed in 0.039963 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表