请教二维数组正确的memset方式?

xychzh 2011-03-06 03:01:00
int test[5][5];

第1种:memset(&test, 0, sizeof(test));
第2种:memset(test, 0, sizeof(test));

调试了一下,都没问题,那一种在语法是是正确的?或者是规范的?
...全文
13610 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_admi 2011-03-08
  • 打赏
  • 举报
回复
CPU也有打盹的时候。

[Quote=引用 15 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]
pathuang68 2011-03-08
  • 打赏
  • 举报
回复
两者是一回事,不存在是否更规范的问题。
jhayumu 2011-03-08
  • 打赏
  • 举报
回复
看一下二维数组的表示方式
int arr[3][4];
memset(&arr[0][0],0,sizeof(arr));
yiyefangzhou24 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 linuxbirdman 的回复:]
第2种:memset(test, 0, sizeof(test));
[/Quote]
+++
xychzh 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhao4zhong1 的回复:]
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]

多谢。
赵4老师 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 super_admi 的回复:]
CPU也有打盹的时候。


引用 15 楼 zhao4zhong1 的回复:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]
但‘CPU’相比‘书、考题、老师、回帖’的可信度约为1:0
赵4老师 2011-03-07
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
yourtse 2011-03-06
  • 打赏
  • 举报
回复
第二种正解,
freeC 2011-03-06
  • 打赏
  • 举报
回复 2
给你贴一个
1 int array[100];
2
3 memset(array, 0, sizeof(array));
4 memset(&array, 0, sizeof(array));
第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。array 相当于 &array[0],而 &array 是一个指向 int[100] 的指针,类型是 int(*)[100]。
以下代码可以看出这个不同:

1 #include <stdio.h>
2
3 int main()
4 {
5 int array[100] = {0, 1, 2};
6 typedef int (*ARRAY)[100];
7 int* p1 = array;
8 ARRAY p2 = &array;
9 //int* p3 = &array; //这样编译错误
10
11 printf("p1 = 0x%08X\n", p1);
12 printf("p2 = 0x%08X\n", p2);
13 printf("p1[2] = %d\n", p1[2]);
14 printf("p2[2] = %d\n", p2[2]);
15 printf("(*p2)[2] = %d\n", (*p2)[2]);
16
17 getchar();
18 return 0;
19 }
运行结果可能是:

p1 = 0x0022FDF8
p2 = 0x0022FDF8
p1[2] = 2
p2[2] = 2294040
(*p2)[2] = 2
yshuise 2011-03-06
  • 打赏
  • 举报
回复
c++就别c了
zhangsongcui 2011-03-06
  • 打赏
  • 举报
回复
最规范的:
int test[5][5]={};
xiaohuh421 2011-03-06
  • 打赏
  • 举报
回复
memset是按字节来设置值,也就是只要你给一个起点指针(指针是什么类型并不重要,最后一个参数是你要设置的BYTE数.

所以在你的程序中 test, test[0], &test[0][0]都是指向相同的地址,也就没有区别了,不过我喜欢最简单原则.
qq120848369 2011-03-06
  • 打赏
  • 举报
回复
或者

memset(test[0],0,sizeof(test));
qq120848369 2011-03-06
  • 打赏
  • 举报
回复
memset(&test[0][0], 0, sizeof(test));

我喜欢这种。
nossiac 2011-03-06
  • 打赏
  • 举报
回复
去百度“数组名与指针的关系”
smallhappiness 2011-03-06
  • 打赏
  • 举报
回复
是个代表数组的地址都行吧。
pengzhixi 2011-03-06
  • 打赏
  • 举报
回复
你甚至可以写memset(&test[0][0], 0, sizeof(test));
pengzhixi 2011-03-06
  • 打赏
  • 举报
回复
这里都没问题。只是个人习惯吧。
LinuxBirdMan 2011-03-06
  • 打赏
  • 举报
回复
你去查下memset这个函数。。然后查下二维数组地址如何表示
xychzh 2011-03-06
  • 打赏
  • 举报
回复
讲一下这两者具体的含义吧,我这语法显然没认真看。
加载更多回复(1)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧