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

递增指向char的指针的左值?,c,pointers,char,C,Pointers,Char,我的问题很简单: 假设你有这个: char *chrptr = "junk"; 想象一下,当时,*chrptr将指向j。是否有办法将当前字符j增加到下一个字符,在这种情况下,下一个字符将是k?我不想转到下一个角色,我想增加指向角色的当前值 char *chrptr = "junk"; char search = 'k'; while (*chrptr) { if (*chrptr == search) printf("%c\n", *chrptr); chtptr++; }

我的问题很简单:

假设你有这个:

char *chrptr = "junk";
想象一下,当时,
*chrptr
将指向
j
。是否有办法将当前字符
j
增加到下一个字符,在这种情况下,下一个字符将是
k
?我不想转到下一个角色,我想增加指向角色的当前值

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

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

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

您不需要使用解引用操作符再次解引用指针

只需执行
chrptr++
即可在内存中推进字符指针

更新

您可以在循环搜索字符的同时换行一个

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

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

您不需要使用取消引用操作符
*
再次取消引用指针

只需执行
chrptr++
即可在内存中推进字符指针

更新

您可以在
循环搜索字符的同时换行一个

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

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

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

//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;

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

//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;
这个代码不是很好。像“垃圾”这样的字符串文本是指向只读内存的指针。你不应该修改它们。所以要么说:

const char* chrptr = "junk"; // pointer to a const; no modifications
或者(在您的情况下):

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

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

(一些剩余的评论)

我不熟悉c,但是(*chrptr)++之类的东西不起作用

它们确实起作用,但不同。让我总结一下:

  • chrptr
    是指向char的指针类型的值
  • *chrptr
    是char类型的值,因为指针已取消引用
这两者恰好都是“l值”(=实际对象),因此您可以修改它们:

  • ++chrptr
    将指针递增一(=将指针向前推进一个对象)
  • ++*chrptr
    将字符增加一(=将
    'a'
    更改为
    'b'
(之前,
++*chrptr
不适用于您,因为字符串位于内存的只读部分。如果您使用
常量char*
而不是
char*
指向它,您将得到一个有用的编译错误,而不是意外的运行时行为。)


另请注意:

对于简单语句,
++*chrptr
相当于
(*chrptr)+。运算符顺序很重要(取消引用,然后递增)

OTOH,
*chrptr++
是增量,然后由于。如果不确定优先级,请添加括号

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

const char* chrptr = "junk"; // pointer to a const; no modifications
或者(在您的情况下):

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

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

(一些剩余的评论)

我不熟悉c,但是(*chrptr)++之类的东西不起作用

它们确实起作用,但不同。让我总结一下:

  • chrptr
    是指向char的指针类型的值
  • *chrptr
    是char类型的值,因为指针已取消引用
这两者恰好都是“l值”(=实际对象),因此您可以修改它们:

  • ++chrptr
    将指针递增一(=将指针向前推进一个对象)
  • ++*chrptr
    将字符增加一(=将
    'a'
    更改为
    'b'
(之前,
++*chrptr
不适用于您,因为字符串位于内存的只读部分。如果您使用
常量char*
而不是
char*
指向它,您将得到一个有用的编译错误,而不是意外的运行时行为。)


另请注意:

对于简单语句,
++*chrptr
相当于
(*chrptr)+。运算符顺序很重要(取消引用,然后递增)

OTOH,
*chrptr++
是增量,然后由于。如果不确定优先级,请添加括号。

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

char*chrptr=“垃圾”

这里,chrptr使用(*chrptr)+指向常量字符数组,依此类推;它不会反映字符串中的更改

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

#包括
使用名称空间std;
int main()
{
字符a[]=“yogendra”;
char*y=a;//(char*)“垃圾”;
(*y)++;
cout看到这个(*chrptr)+;工作正常,但这将增加chrptr指向的数组的第一个字符。
在您的情况下,您使用的语句如下

char*chrptr=“垃圾”

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

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

#包括
使用名称空间std;
int main()
{
字符a[]=“yogendra”;
char*y=a;//(char*)“垃圾”;
(*y)++;

coutSorry,我的示例非常糟糕。这不是我的意思--请阅读我的更新示例。对不起,我的示例非常糟糕。这不是我的意思--请阅读我的更新示例。哦,我看到了你的编辑。让我展开,你