2012-10-21 93 views
1
#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)); 

} 

第一,第二,第三printf的输出为'R','S'&'R'(如预期的那样)。然而行“(* ptr)++;”给运行时错误。有人能解释为什么吗?增加指针时的模糊行为

+0

它看起来不像是在递增指针。您取消引用指针并递增值。 –

+0

我想你想要的是* ptr ++ :) – useratuniv

+1

我认为目标是将'R'增加到下一个ansi字符,所以代码中没有错字 - 只是指针指向的内存是不可修改的。 – jwaliszko

回答

6

原因是因为内存指向ptr是在编译时设置的,并且是不可修改的。

因此,通过*ptr访问第一个字符并且返回R,但尝试增加第一个字符会产生运行时错误,因为您不允许修改您在编译时提供的字符串。

要在下面赛格故障的评论,展开一个更好的方式来编写代码会一直:

const char *ptr ="Ramco Systems"; //pointer to const char 
(*ptr)++; // yields compiletime error because *ptr is a const char 

请注意,在这个新的代码,声明的指针类型更加准确,因此编译器能够在第二行发出编译错误(比运行时错误好得多)。

+1

如果你启用了足够的警告,那么你的编译器也应该在ptr被定义和初始化的地方告诉你这个问题(因为你将一个指针指向一个只读区域指向一个可变指针) 。 –

+0

在c中的字符串文字不是常数..它只是不允许被chaged ..你在这里混合c和C++ – Anirudha

+1

@ Fake.It.Til.U.Make.It这是正确的,但我建议的方式是仍然是更好的编写代码的方法,因为它正确地表示了意图,并且简化了编译时错误而不是运行时。 – Cam

0

的char * PTR =“的Ramco SYSTM”

上面的语句变成指针常数,你试图改变它的内容是无效的,但如果你想编译器扔掉,而编译时错误你可以使用/写入如下: const char * ptr =“Ramco System”

上述语句的行为方式相同。唯一的区别是,当你编写 (* ptr)++时,你会得到一些编译时错误,比如“修改只读位置”。手上

+0

如果你想增加你可以做的地址,就像ptr ++一样,这也是有效的 –

0

(*ptr)++应该*(ptr++)

ptr指向第一个字符

(*ptr)返回的实际值

(*ptr)++是一个错误的原因(*ptr)将在返回右值R你情况)哪些不能被分配也不会递增..还有ptr指向一个常量(不是C++的常量)char wh我不能改变!

你应该先增加ptr然后dereference它即*(ptr++)

误区

字符串文字"xyz"总是在Ç视为char但不能是modified。它们NOT宣称为const或者是不变的,如ot她的。它仅仅是不允许更改或未定义

C++字符串文字表示为const焦炭这不能被chaged

+0

(* ptr)++不等于R ++。所以,这部分解释是错误的。 (* ptr)这里有左值,但由于是字符串文字和只读,所以不能修改它。 – useratuniv

+3

R ++很混乱。 'R'没有左值。休息很好。 – useratuniv

+0

@ rakesh.pandit hmmm..will include tht rvalue point – Anirudha

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'。

如果你想要的是指向“一”,你应该做的:

ptr++; 

通过这样做,你的增加,通过一个ptr指向的地址,通过指向下一个字符。