Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为指针的索引赋值_C_Pointers_Variable Assignment - Fatal编程技术网

C 为指针的索引赋值

C 为指针的索引赋值,c,pointers,variable-assignment,C,Pointers,Variable Assignment,我试图给指针的第二个索引赋值,它会给我一个警告 “[警告]赋值从指针生成整数,无需强制转换” 它不运行这个程序。我想知道,我在哪里犯了错误 #include<stdio.h> void main() { char *p="John"; *(p+2)="v"; printf("%s",p); } #包括 void main() { char*p=“约翰”; *(p+2)=“v”; printf(“%s”,p); } 首先,在您的代码中 char *p="J

我试图给指针的第二个索引赋值,它会给我一个警告

“[警告]赋值从指针生成整数,无需强制转换”

它不运行这个程序。我想知道,我在哪里犯了错误

#include<stdio.h>

void main()
{
    char *p="John";
    *(p+2)="v";
    printf("%s",p);
}
#包括
void main()
{
char*p=“约翰”;
*(p+2)=“v”;
printf(“%s”,p);
}

首先,在您的代码中

 char *p="John";
p
指向字符串文本,并尝试修改字符串文本调用

相关,
C11
,第§6.4.5章

[…]如果程序试图修改这样的数组,则该行为为 未定义

如果要修改,则需要一个数组,如

char p[]="John";
其次
*(p+2)=“v”
是错误的,因为
表示一个字符串,而您需要一个
char
(提示:检查类型os
*(p+2)
)。换成

*(p+2)='v';
为了详细说明差异,请引用第§6.4.4.4章中的
C11
,作为字符常量

整数字符常量是一个包含一个或多个多字节字符的序列 在单引号中,如在
'x'

和第§6.4.5章,字符串文字

字符串文字是包含在字符串中的零个或多个多字节字符的序列 双引号,如
中的“xyz”


第三,根据C标准,
void main()
在代码中至少应该是
int main(void)

第一

 char *p="John";
p
指向字符串文本,并尝试修改字符串文本调用

相关,
C11
,第§6.4.5章

[…]如果程序试图修改这样的数组,则该行为为 未定义

如果要修改,则需要一个数组,如

char p[]="John";
其次
*(p+2)=“v”
是错误的,因为
表示一个字符串,而您需要一个
char
(提示:检查类型os
*(p+2)
)。换成

*(p+2)='v';
为了详细说明差异,请引用第§6.4.4.4章中的
C11
,作为字符常量

整数字符常量是一个包含一个或多个多字节字符的序列 在单引号中,如在
'x'

和第§6.4.5章,字符串文字

字符串文字是包含在字符串中的零个或多个多字节字符的序列 双引号,如
中的“xyz”


第三,根据C标准,
void main()
至少应该是
int main(void)

您正在将一个字符串文本的指针分配给另一个字符串文本的元素

首先,您需要更改指针并使其成为数组,因此任何修改都是合法的,这是一个示例

char p[] = "John";
然后需要将
“v”
替换为
“v”
,它是一个由两个字符
'v'
'\0'
组成的字符串文字,它是字母
'v'
的ascii值,是一个整数

*(p + 2) = 'v';

此外,这是第三个元素,而不是第二个,因为第一个元素是
p[0]

您正在将一个字符串文本的指针分配给另一个字符串文本的元素

首先,您需要更改指针并使其成为数组,因此任何修改都是合法的,这是一个示例

char p[] = "John";
然后需要将
“v”
替换为
“v”
,它是一个由两个字符
'v'
'\0'
组成的字符串文字,它是字母
'v'
的ascii值,是一个整数

*(p + 2) = 'v';

另外,这是第三个元素,而不是第二个,因为第一个元素是
p[0]

您犯了两个错误

首先,您试图修改字符串文本的内容;这会调用未定义的行为,这意味着以下任何行为都是可能的(并且被认为是同样正确的):代码可能会崩溃,可能会运行到完成而没有问题,可能会运行到完成但不会改变字符串文字,可能会使系统处于错误状态,等等。编译器可能会完全拒绝代码,虽然我不知道有哪个编译器能做到这一点

如果希望能够修改字符串的内容,则需要为该字符串留出存储空间,而不仅仅是指向字符串文字:

char p[] = "John"; // copies the contents of the string literal "John" to p
                   // p is sized automatically based on the length of the
                   // string literal
下面是一个假设的内存映射,显示了该声明和初始化的结果:

Address            Item            0x00  0x01  0x02  0x03
-------            ----            ----  ----  ----  ----
0x8000             "John"           'J'   'o'   'h'   'n'
0x8004                             0x00  0x??   0x?? 0x??  // 0x?? represents a random byte value
...
0xfffdc100         p                'J'   'o'   'h'   'n'
0xfffdc104                         0x00  0x??  0x??  0x??
不应修改位于
0x8000
的字符串文字;可以修改位于
0xfffdc100
p
中的字符串(尽管缓冲区的空间最多只能存储4个字符的字符串)

您的第二个错误(也是导致编译器抱怨的错误)在这一行:

*(p+2)="v";
表达式
“v”
是字符串文字,具有类型“char的2元素数组”;由于它不是
sizeof
或一元
&
运算符的操作数,因此类型“衰减”为“指针指向
char
”,表达式的值是字符串文本
“v”
的地址

表达式
*(p+2)
具有类型
char
(它解析为单个字符值),它是一种整数类型,而不是指针类型。不能将指针值指定给非指针对象

您可以通过将该行更改为

*(p + 2) = 'v'; // note single quote vs double quote

这一次,您没有尝试将字符串文本的地址分配给
p[2]
,而是分配单个字符的值

你犯了两个错误

首先,您试图修改字符串文本的内容;这会调用未定义的行为,这意味着以下任何行为都是可能的(并且被认为是同样正确的):代码可能会崩溃,可能会运行到完成而没有问题,可能会运行到完成但不会改变字符串文字,可能会使系统处于错误状态,等等。编译器可能会完全拒绝代码,