搜索
bottom↓
回复: 27

出一道简答题,关于指针和数组

[复制链接]

出0入0汤圆

发表于 2020-3-6 13:37:52 | 显示全部楼层 |阅读模式
int a[]={1,2,3,4,5};

请简述

int *p1 = &a;


int (*p1)[5] = &a;

这两个指针是否有区别并说明理由。

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2020-3-6 13:43:11 | 显示全部楼层
int (*p1)[5] = &a; 这是什么操作,不懂。

出0入0汤圆

发表于 2020-3-6 13:54:35 | 显示全部楼层
虽然不知道楼主的意图,但这句语法不严谨。
  1. int *p1 = &a;
复制代码

应该写成:
  1. int (*p1)[] = &a;
复制代码

出0入0汤圆

 楼主| 发表于 2020-3-6 13:55:33 | 显示全部楼层
styleno1 发表于 2020-3-6 13:54
虽然不知道楼主的意图,但这句语法不严谨。

应该写成:

你直接把题眼写出来了。

第一个不严谨的写法恰恰是设伏的地方

出0入4汤圆

发表于 2020-3-6 14:05:06 | 显示全部楼层
int (*p1)[5]              p1指向一个有5个int元素的数组
int *p1                     p1指向int变量

出0入0汤圆

发表于 2020-3-6 14:13:04 | 显示全部楼层
int *p1 = &a; 首先这个过不了编译

出0入4汤圆

发表于 2020-3-6 14:33:14 | 显示全部楼层
int (*p1)[5] = &a;     定义了 一个(指向《含有5个 int 型数的》数组的)指针,  然后接收数组 a 的地址(第一个元素的地址?)

int *p1 = &a;           定义了 一个(指向 int 型数的)指针,然后接收数组 a 的第一个元素的地址

出0入0汤圆

发表于 2020-3-6 14:41:19 | 显示全部楼层
int *p1 = &a; 不是错的吗 a本来就是指针 &a是指针的指针;int (*p1)[5] = &a; p1是数组指针

出0入0汤圆

发表于 2020-3-6 15:00:15 | 显示全部楼层

int *p1 = a;  这样才是
另外,这代码我看不懂,就不分析了。

出0入4汤圆

发表于 2020-3-6 15:15:29 | 显示全部楼层
int *p1 = &a; 指针类型是 int *
int (*p1)[5] = &a; 指针类型是 int (*)[5]
&a是指向int (*)[5]的,所以第一条语句要类型强制转换.
然后这俩指针值是一样的,只不过类型不一样,看看p1+1的值知道了..
傻孩子那书都白看了你们

出0入0汤圆

发表于 2020-3-6 15:18:36 来自手机 | 显示全部楼层
哪有什么不严谨的,int *p1 来操作数组再正常不过了。带个5并不能带来任何安全性。实际写代码时严格限定读写数组的函数必须带长度就可以

出0入4汤圆

发表于 2020-3-6 15:20:35 | 显示全部楼层
zhugean 发表于 2020-3-6 14:41
int *p1 = &a; 不是错的吗 a本来就是指针 &a是指针的指针;int (*p1)[5] = &a; p1是数组指针 ...

其实单片机中经常这样写
严谨的写法应该是nt *p1 = (int *)&a;

出0入0汤圆

发表于 2020-3-6 15:26:38 | 显示全部楼层
习学发开 发表于 2020-3-6 13:55
你直接把题眼写出来了。

第一个不严谨的写法恰恰是设伏的地方

int (*p1)[5] ;  p1=a,其中的a应是二维数组了。

出0入0汤圆

发表于 2020-3-6 15:31:49 | 显示全部楼层
a本身就是个指针,还加&干什么?

出0入0汤圆

发表于 2020-3-6 15:33:36 | 显示全部楼层
不都是if else咋搞的这么复杂

出0入0汤圆

发表于 2020-3-6 15:34:58 | 显示全部楼层
laujc 发表于 2020-3-6 15:20
其实单片机中经常这样写
严谨的写法应该是nt *p1 = (int *)&a;

严谨的写法就是int * p = a;

出0入0汤圆

发表于 2020-3-6 15:44:41 | 显示全部楼层
楼主天资聪慧,应该去刷LeetCode

玩数组飞指针有点那个啥,孔乙己

出0入0汤圆

发表于 2020-3-6 15:50:46 | 显示全部楼层
nanfang2000 发表于 2020-3-6 15:18
哪有什么不严谨的,int *p1 来操作数组再正常不过了。带个5并不能带来任何安全性。实际写代码时严格限定读 ...

别太绝对,稍微有点,如int32_t (*)[5]和int32_t (*)[],前者在用到明显的越界访问时,新一点的编译器能检测出,会有警告。

出0入8汤圆

发表于 2020-3-6 16:12:28 | 显示全部楼层
小妹妹忽然正经起来了,真是让人刮目相看。

在X64上,int占四个字节,指针八个字节:

    int a[] = { 1,2,3,4,5 };\
    int* p1 = (int *)&a;
    int(*p2)[5] = &a;

    TRACE(traceAppMsg, 0, "p1=0x%p\n", p1);
    TRACE(traceAppMsg, 0, "p2=0x%p\n", p2);
    TRACE(traceAppMsg, 0, "sizeof(p1)=%d\n", sizeof(p1));
    TRACE(traceAppMsg, 0, "sizeof(p2)=%d\n", sizeof(p2));
    TRACE(traceAppMsg, 0, "sizeof(p1[0])=%d\n", sizeof(p1[0]));
    TRACE(traceAppMsg, 0, "sizeof(p2[0])=%d\n", sizeof(p2[0]));
    TRACE(traceAppMsg, 0, "p1 + 2=0x%p\n", p1 + 2);
    TRACE(traceAppMsg, 0, "p2 + 2=0x%p\n", p2 + 2);
    TRACE(traceAppMsg, 0, "*(p1+2)=%d\n", *(p1+2));
    TRACE(traceAppMsg, 0, "*(p2+2)=%d\n", *(p2+2));
    TRACE(traceAppMsg, 0, "&p1[2]=0x%p\n", &p1[2]);
    TRACE(traceAppMsg, 0, "&p2[2]=0x%p\n", &p2[2]);
    TRACE(traceAppMsg, 0, "p1[2]=%d\n", p1[2]);
    TRACE(traceAppMsg, 0, "p2[2]=%d\n", p2[2]);

输出:
p1=0x00000027686FF658
p2=0x00000027686FF658
sizeof(p1)=8
sizeof(p2)=8
sizeof(p1[0])=4
sizeof(p2[0])=20
p1 + 2=0x00000027686FF660
p2 + 2=0x00000027686FF680
*(p1+2)=3
*(p2+2)=1752168064
&p1[2]=0x00000027686FF660
&p2[2]=0x00000027686FF680
p1[2]=3
p2[2]=1752168064

看的到差异吧!

出0入0汤圆

发表于 2020-3-7 07:31:46 来自手机 | 显示全部楼层
styleno1 发表于 2020-3-6 15:50
别太绝对,稍微有点,如int32_t (*)[5]和int32_t (*)[],前者在用到明显的越界访问时,新一点的编译器能 ...

处理函数参数一般都是指针+长度两个参数,基本没见过带数组定义的,太不通用。新编译器会检查?这个倒是不知道,我一直c99

出0入31汤圆

发表于 2020-3-7 09:12:51 | 显示全部楼层
本帖最后由 zchong 于 2020-3-7 09:47 编辑

当搞不清楚的时候,就按照最基本的方式赋值
比如 int *p = &a[0],这样就比较好理解了

印象中int *p = &a这种应该是非法的,但部分编译器没有警告,与nt *p = a等效。

出0入53汤圆

发表于 2020-3-7 10:46:16 | 显示全部楼层
本帖最后由 zhcj66 于 2020-3-7 11:48 编辑
styleno1 发表于 2020-3-6 13:54
虽然不知道楼主的意图,但这句语法不严谨。

应该写成:


fatfs文件系统中,有结构体FIL
我一般使用是 FIL fli_w25; 这样定义 查看文件大小的时候 fli_w25.fsize
问题来了,使用指针定义 FIL *file; 再像上面那样使用 fli_w25.fsize 就会报错,请问这里如何使用呢?

另外 fli_w25.fsize  和 fli_w25->fsize  有什么区别?

出0入53汤圆

发表于 2020-3-7 10:52:39 | 显示全部楼层
uindex 发表于 2020-3-6 16:12
小妹妹忽然正经起来了,真是让人刮目相看。

在X64上,int占四个字节,指针八个字节:

p2[2]=1752168064中的1752168064是什么值?从何而来

出0入8汤圆

发表于 2020-3-7 12:41:45 | 显示全部楼层
zhcj66 发表于 2020-3-7 10:52
p2[2]=1752168064中的1752168064是什么值?从何而来

因为p2是五元素数组类型,P[2]实际指向的是

p2[0] 指向 p1 = {1,2,3,4,5}
p2[1] 指向 p1 + 5 = {?, ?, ?, ?, ?}
p2[2] 指向 p1 + 10 ={?, ?, ?, ?, ?}
p2[2] 切莫以为是指向3

是不是觉得小妹妹正经起来,高攀不起!

出0入8汤圆

发表于 2020-3-7 12:56:32 | 显示全部楼层
更一下帮助理解的code:

  1.     int a[] = { 1,2,3,4,5 };\
  2.     int* p1 = (int *)&a;
  3.     int(*p2)[5] = &a;

  4.     TRACE(traceAppMsg, 0, "p1=0x%p\n", p1);
  5.     TRACE(traceAppMsg, 0, "p2=0x%p\n", p2);
  6.     TRACE(traceAppMsg, 0, "sizeof(p1)=%d\n", sizeof(p1));
  7.     TRACE(traceAppMsg, 0, "sizeof(p2)=%d\n", sizeof(p2));
  8.     TRACE(traceAppMsg, 0, "sizeof(p1[0])=%d\n", sizeof(p1[0]));
  9.     TRACE(traceAppMsg, 0, "sizeof(p2[0])=%d\n", sizeof(p2[0]));
  10.     TRACE(traceAppMsg, 0, "sizeof(p2[0][2])=%d\n", sizeof(p2[0][2]));
  11.     TRACE(traceAppMsg, 0, "p1 + 1=0x%p\n", p1 + 1);
  12.     TRACE(traceAppMsg, 0, "p1 + 2=0x%p\n", p1 + 2);
  13.     TRACE(traceAppMsg, 0, "p1 + 3=0x%p\n", p1 + 3);
  14.     TRACE(traceAppMsg, 0, "p2 + 1=0x%p\n", p2 + 1);
  15.     TRACE(traceAppMsg, 0, "p2 + 2=0x%p\n", p2 + 2);
  16.     TRACE(traceAppMsg, 0, "p2 + 3=0x%p\n", p2 + 3);
  17.     TRACE(traceAppMsg, 0, "&p2[0] + 2=0x%p\n", &p2[0] + 2);
  18.     TRACE(traceAppMsg, 0, "*(p1+2)=%d\n", *(p1+2));
  19.     TRACE(traceAppMsg, 0, "*(p2+2)=%d\n", *(p2+2));
  20.     TRACE(traceAppMsg, 0, "*(&p2[0] + 2)=%d\n", *(&p2[0] + 2));
  21.     TRACE(traceAppMsg, 0, "&p1[2]=0x%p\n", &p1[2]);
  22.     TRACE(traceAppMsg, 0, "&p2[2]=0x%p\n", &p2[2]);
  23.     TRACE(traceAppMsg, 0, "&p2[0][2]=0x%p\n", &p2[0][2]);
  24.     TRACE(traceAppMsg, 0, "p1[2]=%d\n", p1[2]);
  25.     TRACE(traceAppMsg, 0, "p2[2]=%d\n", p2[2]);
  26.     TRACE(traceAppMsg, 0, "p2[0][2]=%d\n", p2[0][2]);
复制代码


输出结果:

p1=0x000000609D13FA48
p2=0x000000609D13FA48
sizeof(p1)=8
sizeof(p2)=8
sizeof(p1[0])=4
sizeof(p2[0])=20
sizeof(p2[0][2])=4
p1 + 1=0x000000609D13FA4C
p1 + 2=0x000000609D13FA50
p1 + 3=0x000000609D13FA54
p2 + 1=0x000000609D13FA5C
p2 + 2=0x000000609D13FA70
p2 + 3=0x000000609D13FA84
&p2[0] + 2=0x000000609D13FA70
*(p1+2)=3
*(p2+2)=-1659635088
*(&p2[0] + 2)=-1659635088
&p1[2]=0x000000609D13FA50
&p2[2]=0x000000609D13FA70
&p2[0][2]=0x000000609D13FA50
p1[2]=3
p2[2]=-1659635088
p2[0][2]=3

出0入53汤圆

发表于 2020-3-7 14:12:07 | 显示全部楼层
uindex 发表于 2020-3-7 12:41
因为p2是五元素数组类型,P[2]实际指向的是

p2[0] 指向 p1 = {1,2,3,4,5}


在来点 **p 的指针,一遇到指针有时就晕头转向

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-3 19:47

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

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