增加指针与增加指针指向的数组元素有啥区别?
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=
修改,但++
只是修改指针本身。
【讨论】:
以上是关于增加指针与增加指针指向的数组元素有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章