gpt4 book ai didi

c - 指向传递给函数的字符的指针。为什么不是指针指向指针?

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:37 26 4
gpt4 key购买 nike

为什么这样的功能:

void inplace_reverse(char * str)
{
if (str)
{
char * end = str + strlen(str) - 1;

// swap the values in the two given variables
// XXX: fails when a and b refer to same memory location
# define XOR_SWAP(a,b) do\
{\
a ^= b;\
b ^= a;\
a ^= b;\
} while (0)

// walk inwards from both ends of the string,
// swapping until we get to the middle
while (str < end)
{
XOR_SWAP(*str, *end);
str++;
end--;
}
# undef XOR_SWAP
}
}

不需要传递一个指向指针的指针来改变字符串吗?

为避免修改函数的本地副本,是否必须传递指向要修改的对象的指针?所以,如果我们想修改一个 int 对象,我们会传递一个 int*?

所以,我的问题是,为什么声明不是这样的:

inplace_revserse( char **str)?

最佳答案

如果要更改指针指向的位置,则需要使用指向指针的指针。

void func( char** str )
{
// this reassigns where in memory the string is located.
// Generally not what you want to do
*str = some_other_char_ptr;
}

但是,如果您只想更改字符串指向的实际内存,那么您只需要一个指针。

int main()
{
char* string = "He";
char** str_ptr = &string;

func(str_ptr);
func2(string);
}


Code MemoryLocation Value
----------------------------------------
string 0x100 0x200
str_ptr 0x104 0x100
...
0x200 'H'
0x201 'e'
0x202 '\0'

所以当我们调用func()时复制并传入的值是0x100。因此,当我们取消引用它时,我们可以访问它存储的值,在本例中为 0x200。但是通过取消引用,我们还可以设置该值:

*str = "a";

Code MemoryLocation Value
----------------------------------------
string 0x100 0x300 <--- note the change
str_ptr 0x104 0x100
...
0x200 'H'
0x201 'e'
0x202 '\0'

0x300 'a'
0x301 '\0'

但是,使用 func2() 复制和传递的值是 0x300 并且无法更改该值,因为它被复制并且对 str 将保留在本地。但是,0x300 处的内存是可以访问和更改的。

关于c - 指向传递给函数的字符的指针。为什么不是指针指向指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com