两个C语法花絮:没有init for和char*w [4] vs char w [4]

Der*_*unk 4 c syntax

刚学习Jon Bentley 编程珍珠的C风格,想知道是否有人可以向我解释以下两段C语法:

for没有init条件的A (参见上面文件中wordncmp中的第2行):

           for ( ; *p == *q; p++, q++)
Run Code Online (Sandbox Code Playgroud)

和.之间的语义差异

            char *word[800000];
Run Code Online (Sandbox Code Playgroud)

            char word[800000];
Run Code Online (Sandbox Code Playgroud)

因为在这种情况下,我认为数组只是指针word[0].

答案选择说明:好的,作为社区的其他成员,我在接受dmckee或CAbbott答案之间徘徊.他们都有重要的知识,我很欣赏.我已经接受了CAbbott的回答,因为它更简单,但给了dmckee一个upvote.尽可能公平,不接受两个答案.谢谢.

dmc*_*kee 6

首先,pq已经建立(q指向现有的字符串,而p到计划复制字符串的缓冲区).


在第二种情况下,你有一个字符数组和一个字符指针数组之间的区别.

字符数组将占用80000*sizeof(char)字节数(通常为80000).指针数组将占用80000*sizeof(char*)32位系统上通常为320000字节或64位系统上为640000字节.

这两个数组都没有初始化.

指针数组可能意图指向一串字符串.


最后:数组和指针不是一回事.我再说一遍:一样.只要编译器需要它们就可以自由地将数组转换为指针.所以你可以在数组上使用指针算法.


CAb*_*ott 6

已经有一段时间了,但这应该是差异:

for ( ; *p == *q; p++, q++)
Run Code Online (Sandbox Code Playgroud)

这只是开发人员不希望在for循环之前进行任何初始化.在这种情况下,开发人员只想迭代指针.

char *word[800000];
and 
char word[800000];
Run Code Online (Sandbox Code Playgroud)

第一个声明一个800000字符*的数组,第二个是800000字符数组

希望有所帮助