使用数组和指针偏移表示法之间的实际区别
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】:
对于任何表达式E1
和E2
,C 标准将E1[E2]
定义为与(*((E1)+(E2)))
相同,因此没有语义差异。
对于大多数用途,下标表示法是首选且更具可读性,但当您想向读者强调某些特定方面时,指针表示法可能很有用。
【讨论】:
【参考方案2】:实际上,两个变体是相同的;对于大多数人来说,数组表示法可能看起来更易读。
但是,使用指针表示法可以稍微重写循环,这可能是任何体面的优化编译器都可以做的(微)优化:
for (char** ptr = strings; ptr != NULL; ++ptr)
len_strings += strlen(*ptr);
【讨论】:
以上是关于使用数组和指针偏移表示法之间的实际区别的主要内容,如果未能解决你的问题,请参考以下文章