C 使用数组和指针偏移量表示法的实际区别
这两者之间有什么不同:C 使用数组和指针偏移量表示法的实际区别,c,C,这两者之间有什么不同: for (int i=0; *(strings+i) != NULL ;i++) len_strings += strlen(*(strings+i)); 以及: 或者这更像是一种风格上的差异,而两者在编译/执行方式上没有实际的差异?对于任何特定的情况或原因,一个表达式优于另一个表达式吗?C标准将E1[E2]定义为与(*((E1)+(E2))对于任何表达式E1和E2相同,因此没有语义差异 对于大多数用途,下标表示法是首选的,并且可读性更好,但是当需要为读者强调某
for (int i=0; *(strings+i) != NULL ;i++)
len_strings += strlen(*(strings+i));
以及:
或者这更像是一种风格上的差异,而两者在编译/执行方式上没有实际的差异?对于任何特定的情况或原因,一个表达式优于另一个表达式吗?C标准将
E1[E2]
定义为与(*((E1)+(E2))
对于任何表达式E1
和E2
相同,因此没有语义差异
对于大多数用途,下标表示法是首选的,并且可读性更好,但是当需要为读者强调某些特定方面时,指针表示法可能很有用。在实践中,两种变体是相同的;对于大多数人来说,数组表示法可能看起来更具可读性 但是,使用指针表示法可以稍微重写循环,这可能是一点(微观)优化,任何一个体面的优化编译器都可以做到:
for (char** ptr = strings; ptr != NULL; ++ptr)
len_strings += strlen(*ptr);
实际的区别是,键入下标符号更容易,管理双下标比另一种方法要容易得多:
ptrptr[i][j]
vs*(*(ptrptr+i)+j)
。大多数情况下使用下标符号。偶尔使用替代品会有好处,但不经常。
for (char** ptr = strings; ptr != NULL; ++ptr)
len_strings += strlen(*ptr);