c# 指向char数组的双指针

hec6srdp  于 2023-06-20  发布在  C#
关注(0)|答案(1)|浏览(275)

我一直试图弄清楚双指针如何与char * 和char []一起工作。我想做的是给char * 或char []分配一个双指针,然后改变内容。

#include <stdio.h>

int main()
{
    char * message2 = "bye world";
    char message[] = "hello world";
    
    char ** ptr_message2 = &message2;
    char ** ptr_message = (char*)&message;
    
    *ptr_message2 = "Bye";
    *ptr_message = "Hello";
    
    printf("%s \n", message2);
    printf("%s \n", message);
    return 0;
}

我想使用char[]并将双指针分配给它,并更改内容,但我很难理解。

yhxst69z

yhxst69z1#

在这份宣言中

char * message2 = "bye world";

声明了一个指向字符串文字"bye world"的第一个字符的指针。您可以重新指定指针以指向另一个字符串,例如

message2 = "Bye";

字符串文字本身不会改变。是指针发生了变化。首先它指向一个字符串文字的第一个字符,然后它被另一个字符串文字的第一个字符的地址重新分配。
这份声明

char ** ptr_message2 = &message2;

只会增加一个间接地址。所以上述说法

message2 = "Bye";

可以重写为

*ptr_message2 = "Bye";

与指针相对的数组不支持赋值运算符。如果要更改数组的内容,则需要单独更改其元素。例如,要将字符串复制到字符数组中,可以这样写

#include <string.h>

//...

char message[] = "hello world";

strcpy( message, "Hello" );

至于你的代码然后在这个声明之后

char ** ptr_message = (char*)&message;

指针ptr_message存储由阵列占用的存储器的范围的地址,该地址与阵列的第一字符的地址相同。
取消引用指针

*ptr_message = "Hello";

存储在阵列的第一元素中的值被认为是地址的值。由于存储的字符串"hello world"表示有效地址,因此解引用指针具有无效值,并且上面的语句调用未定义行为。
使用指向指针的指针,你可以这样写,例如通过引入一个中间指针,如下所示

#include <string.h>

//...

char message[] = "hello world";

//...

char *ptr = message;
char ** ptr_message = &ptr;

//...

strcpy( *ptr_message, "Hello" );

现在解引用指针ptr_message,您将获得另一个指针(而不是字符串字面量的字符),该指针指向数组的第一个字符,并可以使用它来更改数组的元素。
注意这些声明中的内容

char * message2 = "bye world";

和/或

char *ptr = message;

用作初始化器的数组(字符串文字具有字符数组的类型)被隐式地转换为指向它们的第一个元素的指针。

相关问题