增加指针与增加指针指向的数组元素有啥区别?

Posted

技术标签:

【中文标题】增加指针与增加指针指向的数组元素有啥区别?【英文标题】:Whats the difference between incrementing a pointer compared to incrementing the elements of the array the pointer points to?增加指针与增加指针指向的数组元素有什么区别? 【发布时间】:2021-03-16 10:16:16 【问题描述】:

我试图了解这两个函数之间的区别是什么:

void funk1(char* goal, char* source)
int i = 0;
while((goal[i]= source[i]) != ’\0’)
i++; 

void funk2(char* goal, char* source)
while((*goal= *source) != ’\0’)
  goal++;
source++;
 

有人可以帮帮我吗?

【问题讨论】:

他们做同样的事情,我想。为什么你认为有区别? A) 这看起来像是对strcpy() 的一种弱重新实现,并不安全。至少使用strncpy()。 B) 在 C++ 中,为了您自己,请使用std::string,这样您就可以避免 C 字符串带来的无休止的痛苦。 C)如果你正在做这样的事情,也许for 循环会更好。 【参考方案1】:

递增指针与递增指针指向的数组元素有什么区别?

增加指针(或更一般地,任何迭代器)会修改指针。结果指针将指向数组的下一个元素。

通过指针间接并递增指向的对象会修改指向的对象。增量如何修改对象取决于对象的类型。


请注意,在您的两个示例中,您都没有增加数组的元素。在第一个中,您递增变量i,它是一个用作索引的整数,而在第二个中,您递增两个指针。

【讨论】:

【参考方案2】:

编译器可能会为这两种情况创建相同的可执行文件。但是,如果您将使用告诉编译器“不要优化”的显式标志进行编译,则 funk2 会更快一些(请注意,在当今的现代计算机上,它被忽略了)。 为什么?

    funk1 需要 4 个寄存器,而 funk2 只需要 3 个。 因为运算goal[i]等价于*(goal + i),比++计算量大。

【讨论】:

【参考方案3】:

goal[i] 等价于*(goal + i),因此两种实现都有效。

注意:这些函数实际上都不是“增加指针指向的数组元素”。数组的元素用operator=修改,但++只是修改指针本身。

【讨论】:

以上是关于增加指针与增加指针指向的数组元素有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

数组指针的谜题

c#拷贝数组指针中的元素到变量中

数组指针是二级指针吗?请解释一下!谢谢!

如何增加 C 中的指针(二维数组)

数组的地址+1 和 指向数组的指针+1 区别

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