使用数组和指针偏移表示法之间的实际区别

Posted

技术标签:

【中文标题】使用数组和指针偏移表示法之间的实际区别【英文标题】:Practical difference between using array and pointer offset notation 【发布时间】:2019-09-30 02:49:05 【问题描述】:

两者有什么不同:

for (int i=0; *(strings+i) != NULL ;i++)
    len_strings += strlen(*(strings+i));

还有:

for (int i=0; strings[i] != NULL ;i++)
    len_strings += strlen(strings[i]);

还是更多的是风格上的差异,两者在编译/执行方式上没有实际差异?出于任何特定情况或原因,一个优先于另一个?

【问题讨论】:

实际的区别在于它更容易键入下标符号,并且比其他方法更容易管理双下标:ptrptr[i][j]*(*(ptrptr + i) + j)。大多数时候使用下标符号。有时使用替代方案会有好处,但并不经常。 【参考方案1】:

对于任何表达式E1E2,C 标准将E1[E2] 定义为与(*((E1)+(E2))) 相同,因此没有语义差异。

对于大多数用途,下标表示法是首选且更具可读性,但当您想向读者强调某些特定方面时,指针表示法可能很有用。

【讨论】:

【参考方案2】:

实际上,两个变体是相同的;对于大多数人来说,数组表示法可能看起来更易读。

但是,使用指针表示法可以稍微重写循环,这可能是任何体面的优化编译器都可以做的(微)优化:

for (char** ptr = strings; ptr != NULL; ++ptr)
    len_strings += strlen(*ptr);

【讨论】:

以上是关于使用数组和指针偏移表示法之间的实际区别的主要内容,如果未能解决你的问题,请参考以下文章

指针数组和数组指针的区别

结构体指针数组和结构体数组指针的区别

C语言 使用指针遍历数组

ptr[-1]的作用和用法

指针进阶

C语言基础知识:指针和数组的区别是什么?