我一直试图弄清楚双指针如何与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[]并将双指针分配给它,并更改内容,但我很难理解。
1条答案
按热度按时间yhxst69z1#
在这份宣言中
声明了一个指向字符串文字
"bye world"
的第一个字符的指针。您可以重新指定指针以指向另一个字符串,例如字符串文字本身不会改变。是指针发生了变化。首先它指向一个字符串文字的第一个字符,然后它被另一个字符串文字的第一个字符的地址重新分配。
这份声明
只会增加一个间接地址。所以上述说法
可以重写为
与指针相对的数组不支持赋值运算符。如果要更改数组的内容,则需要单独更改其元素。例如,要将字符串复制到字符数组中,可以这样写
至于你的代码然后在这个声明之后
指针
ptr_message
存储由阵列占用的存储器的范围的地址,该地址与阵列的第一字符的地址相同。取消引用指针
存储在阵列的第一元素中的值被认为是地址的值。由于存储的字符串
"hello world"
表示有效地址,因此解引用指针具有无效值,并且上面的语句调用未定义行为。使用指向指针的指针,你可以这样写,例如通过引入一个中间指针,如下所示
现在解引用指针
ptr_message
,您将获得另一个指针(而不是字符串字面量的字符),该指针指向数组的第一个字符,并可以使用它来更改数组的元素。注意这些声明中的内容
和/或
用作初始化器的数组(字符串文字具有字符数组的类型)被隐式地转换为指向它们的第一个元素的指针。