注册 登录
编程论坛 C语言论坛

关于数组的一个问题,请教大家,谢谢!

oyd7141 发布于 2020-06-23 17:11, 3800 次点击
#include<stdio.h>

int main()
{
    int a[]={1,2,3,4,5};
    int *p;
    printf("%d\n",sizeof(a));
    p=a;
    printf("%d\t%d\n",sizeof(p),p);
    printf("%d\n",sizeof(p[0]));        //为什么这里得到的是4字节;
    printf("%d\t%d\n",sizeof(p[0],&p[0]));    //为这什么这里得到的是8字节
return 0;
}

运行结果:
只有本站会员才能查看附件,请 登录
19 回复
#2
fulltimelink2020-06-23 17:38
见逗号表达式
#3
oyd71412020-06-23 18:25
回复 2楼 fulltimelink
谢谢你,看清楚了。这个DEV-C++字太小了,没看清楚。
printf("%d\t%d\n",sizeof(p[0]),&p[0]);    //变成4字节了,我是这个意思!
#4
ditg2020-06-23 22:48

sizeof返回类型一般是unsigned long,建议用%lu;
指针按你前面是8字节,但%d是4字节。

不知道对错,仅供参考,还是养成良好的编程习惯比较好

#5
rjsp2020-06-23 23:04
回复 4楼 ditg
sizeof 的类型是 size_t,用 %zu
#6
ditg2020-06-23 23:17
typedef unsigned long size_t;
#7
lin51616782020-06-24 01:40
以下是引用ditg在2020-6-23 23:17:03的发言:

typedef unsigned long size_t;

没要求必须是unsigned long
有的编译器是unsigned int
不要把实现当成唯一真理
#8
lin51616782020-06-24 01:41
以下是引用ditg在2020-6-23 23:17:03的发言:

typedef unsigned long size_t;

这就是为什么楼上说要用 zu 的原因
不同编译器 zu 匹配不同类型 可以unsigned int 可以unsigned long
#9
fulltimelink2020-06-24 09:31
这个不是和编译时选择的目标平台有关系吗   x86 指针可能是4   x64可能是8

不管sizeof 返回的是4还是8    %d肯定能显示的下啊
#10
lin51616782020-06-24 09:44
回复 9楼 fulltimelink
能显示也不能随便写
printf的格式控制符 还有指定数据字节数的作用
不匹配的格式控制符 会导致读取数据错位 造成错误
#11
fulltimelink2020-06-24 10:01
回复 10楼 lin5161678
嗯,这个我理解,我说的是这个   “指针按你前面是8字节,但%d是4字节。”   ,不知道是不是我理解错 ditg的意思 了
#12
ditg2020-06-24 10:04
你们说,俺要是在64位平台下整出个%zu 4字节输出,是不是大家都有点尴尬……

 typedef unsigned size_t;

能编译通过的截个图呗,嘻嘻

程序代码:
#include <stdio.h>

typedef unsigned int size_t;
//typedef unsigned long size_t;

int main(void)
{
    return 0;
}


[此贴子已经被作者于2020-6-25 11:53编辑过]

#13
fulltimelink2020-06-24 10:55
vc给了个建议zd....


warning C4477: “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“size_t”
note: 请考虑在格式字符串中使用“%zd”
#14
ditg2020-06-24 17:38
越看越蒙,%zd不就是long型控制吗?是类型不是长度size_t?

[此贴子已经被作者于2020-6-24 19:14编辑过]

#15
oyd71412020-06-24 21:27
回复 4楼 ditg
嗯嗯,自己写着玩,不是专业人士,习惯不太好

以后保证注意,谢谢你的提醒
#16
ditg2020-06-25 10:40
回复 15楼 oyd7141
俺也是个半壶水……
#17
ditg2020-06-25 10:41
回复 11楼 fulltimelink
程序代码:
#include <stdio.h>

int main(void)
{
    char a;
    printf("%#x\n", &a);
    printf("%#lx\n", &a);
    return 0;
}
#18
fulltimelink2020-06-25 18:09
回复 17楼 ditg
没看懂,这个和sizeof有啥关系么?
#19
ditg2020-06-25 19:23
回复 18楼 fulltimelink
我想想怎么说……

楼主:printf("%d\t%d\n",sizeof(p[0]),&p[0]);

取地址已知是8字节,但%d是整型输出显示地址值的低4字节,就算不考虑符号问题,也应该是%ld输出显示
#20
fulltimelink2020-06-25 23:45
回复 19楼 ditg
我以为你说的是前面那个%d,后面的可以%p
1