搜索
bottom↓
回复: 6

关于指针变量定义问题

[复制链接]

出0入0汤圆

发表于 2021-5-17 01:26:12 | 显示全部楼层 |阅读模式
本帖最后由 quder 于 2021-5-17 01:30 编辑

论坛内的大佬们,我又有一个问题了

我定义了一个变量
  1. unsigned char *Pixle
复制代码


那么这个unsigned char是指Pixle=0xA5,是指这个地址的大小是unsigned char型的,还是这个地址所对应的变量是unsigned char 型的

这个和
  1. uinsigned char AA[10]
复制代码
类比的话,AA内变量是unsigned char型的 但是 单独AA是个地址 我引用AA的话可不可以放到函数
  1. void TFTSPI_BinRoad(unsigned char high_start, unsigned char wide_start, unsigned char high, unsigned char wide, unsigned char *Pixle)
  2. {
  3.         unsigned long i;
  4.     /* 设置显示范围 */
  5.     TFTSPI_Set_Pos(wide_start, high_start, wide_start - 1 + wide, high_start - 1 + high);

  6.     unsigned long temp = high * wide;
  7.     /* 显示图像 */
  8.     for(i = 0; i < temp; i++)
  9.     {
  10.         if(Pixle[i])
  11.         {
  12.             /* 显示 */
  13.             TFTSPI_Write_Word (0xffff);
  14.         }
  15.         else
  16.         {
  17.             /* 显示 */
  18.             TFTSPI_Write_Word (0);
  19.         }

  20.     }

  21. }
复制代码
最后一个变量位,还是需要(unsigned char *)强制转换一下?

如果是需要强制转换 那(unsigned char *) 这个unsigned char是指地址是这种类型的 还是指地址所对应的变量是这种类型的?

如果指的是地址,那么引用后的 Pixle[6] 是会默认为unsigned char 变量吗?

写的有点乱,刚入门没多久,在百度CSDN上也搜不到这类问题

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出50入58汤圆

发表于 2021-5-17 07:30:03 来自手机 | 显示全部楼层
第一个问题,答案是后者,即指针的类型是指它所指向的对象的类型
第二个问题,可以把数组名作为参数传递给函数,实际也是这么用的

出50入58汤圆

发表于 2021-5-17 14:39:44 | 显示全部楼层
估计大佬们看到这个问题太简单都不想回复.那我再班门弄斧一次,说的不对的地方轻喷:

所有的指针,数组名,函数名本质都是一个地址,这个地址的长度由使用的器件和编译器决定,例如51内核的一般是2字节, Cortex-M 内核是4字节
他们之间可以互换,比如:
    可以把一段程序放在数组中,将数组名赋值给一个函数指针,通过函数指针运行数组内的代码
    可以把一个变量强制转换为函数指针,通过调用函数指针跳转到到某个地址
    可以把多个变量放在数组中,将数组名赋值给一个字符指针,通过字符指针读写数组(你的这个例子)
    可以把函数名赋值给字符指针,通过字符操作打印出函数所在的具体地址
    可以把浮点类型变量的地址强制转换为字符指针,将浮点数按字节打印或存储
等等……

指针是C语言的精髓,同时也如同在刀刃上跳芭蕾一样优雅而危险!

出0入0汤圆

发表于 2021-5-17 14:52:15 | 显示全部楼层
没看懂:
不管什么指针,在32位系统,它都是32位的。
指针的类型(字节宽度)由你定。

出0入54汤圆

发表于 2021-5-17 15:42:41 | 显示全部楼层
  1. int main(void)
  2. {
  3.     char *p1;
  4.     short *p2;
  5.     int *p3;
  6.     long *p4;
  7.     float *p5;
  8.    
  9.     char a[10];
  10.     short b[10];
  11.     int c[10];
  12.     long d[10];
  13.     float e[10];
  14.    
  15.   
  16.     //第一步 看看类型在你机器上多大
  17.     printf("type char lenth is %d\n\r",sizeof(char));
  18.     printf("type short lenth is %d\n\r",sizeof(short));
  19.     printf("type int lenth is %d\n\r",sizeof(int));
  20.     printf("type long lenth is %d\n\r",sizeof(long));
  21.     printf("type float lenth is %d\n\r",sizeof(float));
  22.    
  23.    //第二步 看看不同类型的指针大小是多少

  24.     p1=&a[0];//p1=a;效果等价,但意义不同
  25.     p2=&b[0];
  26.     p3=&c[0];
  27.     p4=&d[0];
  28.     p5=&e[0];   

  29.     printf("type char* lenth is %d\n\r",sizeof(p1));
  30.     printf("type short* lenth is %d\n\r",sizeof(p2));
  31.     printf("type int* lenth is %d\n\r",sizeof(p3));
  32.     printf("type long* lenth is %d\n\r",sizeof(p4));
  33.     printf("type float* lenth is %d\n\r",sizeof(p5));

  34.    //第三步 看看不同类型的指针内是什么
  35.    

  36.     printf("p1 vlue is %04x\t &a[0] address is %04x\n\r",(int)p1,(int)(&a[0]));
  37.     printf("p2 vlue is %04x\t &b[0] address is %04x\n\r",(int)p1,(int)(&b[0]));
  38.     printf("p3 vlue is %04x\t &c[0] address is %04x\n\r",(int)p1,(int)(&c[0]));
  39.     printf("p4 vlue is %04x\t &d[0] address is %04x\n\r",(int)p1,(int)(&d[0]));
  40.     printf("p5 vlue is %04x\t &e[0] address is %04x\n\r",(int)p1,(int)(&e[0]));
  41.    
  42.    //第四步 看看不同类型的指针++后有什么变化
  43.   
  44.     printf("p1 vlue is %04x\t",(int)p1);
  45.     p1++;
  46.     printf("p1 vlue is %04x\n\r",(int)p1);
  47.    
  48.     printf("p2 vlue is %04x\t",(int)p2);
  49.     p1++;
  50.     printf("p2 vlue is %04x\n\r",(int)p2);

  51.     printf("p3 vlue is %04x\t",(int)p3);
  52.     p1++;
  53.     printf("p3 vlue is %04x\n\r",(int)p3);
  54.    
  55.     printf("p4 vlue is %04x\t",(int)p4);
  56.     p1++;
  57.     printf("p4 vlue is %04x\n\r",(int)p4);
  58.    
  59.     printf("p5 vlue is %04x\t",(int)p5);
  60.     p1++;
  61.     printf("p5 vlue is %04x\n\r",(int)p5);
  62.    
  63.     //第五步 灵活混搭一下看看
  64.    
  65.     a[0]=10;
  66.     a[1]=11;
  67.     a[2]=12;
  68.     a[3]=13;
  69.    
  70.     b[0]=100;
  71.     b[1]=110;
  72.     b[2]=120;
  73.     b[3]=130;  

  74.     p1=&a[0]; //p1 是char*类型的
  75.    
  76.     printf("*p1=%d\t",*p1);
  77.     p1++;
  78.     printf("*p1=%d\n\r",*p1);  

  79.     p1=(char*)&b[0];// 理解这步和一下的结果是本程序的核心
  80.    
  81.     printf("*p1=%x\t",*p1);//看看打印了些什么东西  100 = 0x0064
  82.     p1++;
  83.     printf("*p1=%x\n\r",*p1); //看看打印了些什么东西  100 = 0x0064
  84.    
  85.     p2=(short*)&a[0];
  86.    
  87.     printf("*p2=%x\t",*p1);//看看打印了些什么东西
  88.     p1++;
  89.     printf("*p2=%x\n\r",*p1); //看看打印了些什么东西   
  90.    
  91.    
  92. }
复制代码


上面的程序看看 然后运行运行 然后就都明白了。

出0入0汤圆

 楼主| 发表于 2021-7-12 05:09:06 | 显示全部楼层
鲜衣怒马 发表于 2021-5-17 14:39
估计大佬们看到这个问题太简单都不想回复.那我再班门弄斧一次,说的不对的地方轻喷:

所有的指针,数组名 ...

懂了,谢谢大佬

出0入0汤圆

 楼主| 发表于 2021-7-12 05:11:17 | 显示全部楼层
unifax001 发表于 2021-5-17 15:42
上面的程序看看 然后运行运行 然后就都明白了。

谢谢大佬,确实要自己实操一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 23:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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