&(str[i])与(&str)[i]的区别及性能优劣对比
&(str[i]) 和 (&str)[i] 的区别与性能对比 核心区别
两者本质完全不同,其中(&str)[i]是不符合你需求的错误写法:
&(str[i]):
C语言中str[i]等价于*(str + i)(数组下标运算符[]的本质就是指针偏移后解引用)。对其取地址&*(str + i)会被编译器直接优化为str + i,最终得到的是从str起始位置偏移i个char长度的内存地址,这正是你需要的子串str[i...]的起始指针,完全符合传递子串的需求。(&str)[i]:&str的类型是const char**(指向char指针的指针)。(&str)[i]等价于*(&str + i),也就是把存储str这个指针变量的地址,偏移i个const char*的长度(32位系统为4字节,64位为8字节)后再解引用。这个操作得到的指针指向的是完全不确定的内存区域(可能是栈上其他变量或无效内存),不仅无法得到你想要的子串起始地址,还会引发未定义行为(比如程序崩溃、数据乱码)。
性能对比
&(str[i])会被编译器优化为单一的地址加法操作,几乎没有任何开销,是高效且正确的写法。(&str)[i]本身是逻辑错误的写法,即便忽略错误,它的操作包含指针的指针偏移和解引用两步,步骤比前者多,但更关键的是它完全无法实现你的需求,不存在“速度优势”的讨论价值。
内容的提问来源于stack exchange,提问作者devgirl05
相关产品推荐
相关产品推荐

