#include<stdio.h>
main()
{
char c = 'R';
printf("%c\n",c);
c++;
printf("%c\n",c);
char *ptr ="Ramco Systems";
printf("%c\n",(*ptr));
(*ptr)++;
printf("%d\n",(*ptr));
}
第一,第二,第三印刷品的输出是'R','S'和&amp; 'R'(如预期的那样)。但行“(* ptr)++;”给运行时错误。有人可以解释原因吗?
答案 0 :(得分:5)
原因是因为指向ptr
的内存是在编译时设置的,并且是不可修改的。
因此,通过*ptr
访问第一个字符很好并返回R
,但尝试增加第一个字符会产生运行时错误,因为您不允许修改在编译时提供的字符串。 / p>
要扩展下面的Seg Fault评论,编写代码的更好方法是:
const char *ptr ="Ramco Systems"; //pointer to const char
(*ptr)++; // yields compiletime error because *ptr is a const char
注意在这个新代码中,声明的指针类型更准确,因此编译器能够在第二行给出编译时错误(比运行时错误好得多)。
答案 1 :(得分:0)
char * ptr =“Ramco Systm”
上面的语句变成指向常量的指针,你试图修改它的内容是无效的,但是如果你想让编译器在编译时抛出错误,你可以使用/ write如下所示: const char * ptr =“Ramco System”
以上陈述的行为方式相同。唯一的区别是你写的时候 (* ptr)++,你会得到一个编译时错误,例如“修改只读位置”。在手上
答案 2 :(得分:0)
(*ptr)++
应为*(ptr++)
ptr
指向第一个字符
(*ptr)
返回实际值
(*ptr)++
是一个错误原因(*ptr)
会返回右值(在您的情况下为R
),但无法分配或增加..还{{1}指向一个不能改变的常量(不是c ++的const)char!
您应首先增加ptr
然后ptr
增加dereference
<强>误读强>
像*(ptr++)
这样的 字符串文字在 C 中始终被视为"xyz"
,但不能为char
。它们不声明为modified
或按其他人声称不变。只是不允许更改或未定义
在 C ++ 字符串文字中表示为const
字符不可用的字符
答案 3 :(得分:0)
也许你正在尝试做这样的事情?
#include<stdio.h>
main()
{
char c = 'R';
printf("%c\n",c);
c++;
printf("%c\n",c);
char aux[] = "Ramco Systems";
char *p = aux;
printf("%c\n",(*ptr));
(*ptr)++;
printf("%d\n",(*ptr));
}
但请记住,您取消引用的以下行然后递增:
(*ptr)++;
所以它的行为如下:“我指的是什么字母?好的,把这封信改成下一个字母(带有ascii代码1字母单位的字母)”在这种情况下,将'R'改为'S'。
如果你想要的是指向'a',你应该这样做:
ptr++;
通过执行此操作,您将ptr指向的地址递增1,并指向下一个字符。