常量指针数组或指向数组的指针?什么是更快的C?

Mar*_*elo 3 c arrays pointers pointer-arithmetic

您好,我现在正在中级C课,这个想法刚出现在我脑海中:

int multi[3][4]; // const multidimensional array

int* ptr = *multi; // ptr is a pointer variable that hold the address of multi const array
Run Code Online (Sandbox Code Playgroud)

那么,访问多维数组位置的更快/更小/优化是什么?

这个:

multi[3][1]; // index the value position
Run Code Online (Sandbox Code Playgroud)

要么

*(*(multi+2)+1); // pointer to the position on the array
Run Code Online (Sandbox Code Playgroud)

或(更新)

ptr += 9; // pointer arithmetic using auxiliary pointer
Run Code Online (Sandbox Code Playgroud)

由于"multi"是一个const数组,编译器应该"知道"元素位置的本地化,如果使用指向该数组的变量指针可能需要更多的处理时间,另一方面在搜索时可能更快我想要显示的项目.什么是更快/更小/优化的方法?

先感谢您.

Bla*_*ear 8

它们都是以相同的方式编译的*(pointer_to_first_element + x + y).


AnT*_*AnT 6

首先

int multi[3][4];
Run Code Online (Sandbox Code Playgroud)

不是const数组.const这个宣言中没有任何内容.

其次,

int* ptr = *multi;
Run Code Online (Sandbox Code Playgroud)

ptr指出元素multi[0][0].数字上它与整个地址multi[0]和地址相同multi,但类型不同.

第三,

multi[3][1];
Run Code Online (Sandbox Code Playgroud)

根据定义,它是相同的

*(*(multi + 3) + 1);
Run Code Online (Sandbox Code Playgroud)

所以在性能方面没有任何合理的差异.它与上述内容的联系方式尚不清楚.

第四,

*ptr + 9;
Run Code Online (Sandbox Code Playgroud)

它没有任何"指针算术".它相当于

multi[0][0] + 9;
Run Code Online (Sandbox Code Playgroud)

这是一个普通的整体补充.再次,它与上述内容的联系方式尚不清楚.

最后,您的问题标题为"常量指针数组或指向数组的指针",而在问题的实际文本中,我看不到.