递增指向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,我的示例非常糟糕。这不是我的意思--请阅读我的更新示例。对不起,我的示例非常糟糕。这不是我的意思--请阅读我的更新示例。哦,我看到了你的编辑。让我展开,你