增加指向char的指针的左值?

时间:2012-10-23 05:46:51

标签: c pointers char

我的问题很简单:

说你有这个:

char *chrptr = "junk";

想象一下,*chrptr当时会指向j。有没有办法将当前字符j增加到下一个字符,在这种情况下是k?我不想去下一个角色,我想增加当前指向的角色。

我是C的新手,我尝试过:(*chrptr)++不起作用。

4 个答案:

答案 0 :(得分:3)

根据您的编辑,您似乎想要修改字符串,您不能使用常量字符串,实际上您可以但该行为未定义。因此,您需要将定义更改为非常量字符数组:

//This initializes a 5 element array including the null byte at the end
char chrptr[] = "junk";
//now you can modify that
chrptr[0]++;
//or equivalently 
chrptr[0] +=1;
chrptr[0] = chrptr[0]+1;

答案 1 :(得分:2)

char *chrptr = "junk";

这段代码并不是很好。像“垃圾”这样的字符串文字是指向只读内存的指针。你不应该修改它们。所以要么说:

const char* chrptr = "junk"; // pointer to a const; no modifications

或(在您的情况下):

char chrArray[] = "junk";

这会在堆栈上创建一个5元素的字符数组,用“垃圾”(加上空终止符)初始化它。现在您可以自由修改它:

chrArray[0] ++;
(*chrArray) ++;

(一些剩余的评论)

  

我是c的新手,但是(* chrptr)++之类的东西不起作用。

他们工作,但不同。让我总结一下:

  • chrptr是指向char的类型的值。
  • *chrptr是char类型的值,因为指针已被解除引用。

这两个都恰好是“l-values”(=实际对象),所以你可以修改它们:

  • ++ chrptr将指针递增1(=将指针向前推进一个对象)
  • ++ *chrptr将char加1(=将'a'更改为'b')。

(之前,++*chrptr不适合您,因为该字符串位于内存的只读部分。如果您使用const char*而不是char*指向该字符串,那么d得到一个有用的编译错误而不是意外的运行时行为。)


另请注意:

如果是简单陈述,++*chrptr;相当于(*chrptr)++;。操作员顺序很重要(取消引用,然后递增)。

OTOH,由于operator precedence*chrptr++是增量 - 然后 - 解除引用。如果不确定优先级,请添加括号。

答案 2 :(得分:1)

您无需使用取消引用运算符*再次取消引用指针。

你只需要chrptr++来推进内存中的字符指针。

<强>更新

您可以包裹while循环来搜索角色。

char *chrptr = "junk";
char search = 'k';

while (*chrptr) {
  if (*chrptr == search)
    printf("%c\n", *chrptr);
  chtptr++;
}

答案 3 :(得分:1)

见(* chrptr)++;工作正常,但这会增加chrptr指向的数组的第一个字符。 在您的情况下,您使用的语句如

  

char * chrptr =“junk”;

这里chrptr指向一个const char数组,所以使用(* chrptr)++;它会增加不会反映字符串中的变化。

但是如果你这样使用代码(http://codepad.org/FJMB1ryv): -

#include<iostream>

using namespace std;

int main()
{
char a[]="yogendra";
char *y=a;//(char*)"junk";
(*y)++;
cout<<y<<endl;
return 0;
}

你(* y)++会工作。希望这会对你有所帮助。祝你好运:)