【问题标题】:Incrementing the lvalue of a pointer to char?增加指向char的指针的左值?
【发布时间】:2012-10-23 05:46:50
【问题描述】:

我的问题很简单:

假设你有这个:

char *chrptr = "junk";

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

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

【问题讨论】:

    标签: c pointers char


    【解决方案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;
    

    【讨论】:

    • 我不会使用那种语法。由于它不是常见的东西,它只会使读者感到困惑。我认为更好的方法是写chrptr[0] = chrptr[0]+1;,这将产生相同的机器代码。
    • 我添加了一些其他的,但这并不少见,恕我直言,这是最简洁的形式。
    • @Lundin 为什么要说两次chrptr[0]anything += 1 读作“将任何内容增加 1”,乍一看非常容易理解
    • @Kos 我认为 += 1 也很好。 [0]++ 让我觉得有潜在的危险,因为真正的代码看起来像chrptr[i]++。从那里,这一步到chrptr[i++] 不远了,它编译得很好,但意味着完全不同的东西。将 ++ 运算符与其他运算符一起使用通常是个坏主意。
    【解决方案2】:
    char *chrptr = "junk";
    

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

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

    或(在您的情况下):

    char chrArray[] = "junk";
    

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

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

    (一些多余的评论)

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

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

    • chrptr 是指针类型的值。
    • *chrptr 是 char 类型的值,因为指针已被取消引用。

    这两个恰好是“左值”(= 实际对象),因此您可以修改它们:

    • ++ chrptr 将指针加一(= 将指针前移一个对象)
    • ++ *chrptr 将字符加一(= 将 'a' 更改为 'b')。

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


    另请注意:

    在简单语句的情况下,++*chrptr; 等价于(*chrptr)++;。运算符顺序很重要(取消引用,然后递增)。

    OTOH,*chrptr++ 是先递增然后取消引用,因为 operator precedence。如果不确定优先级,请添加括号。

    【讨论】:

    • 哦,我看到了你的编辑。让我扩展一下,你的问题是不同的
    • 是的,我的例子真的很糟糕。很抱歉问了一个措辞不好的问题,浪费了您的时间。
    • @fayyazkl 啊显然是的,谢谢! C#,你对我做了什么……:(
    • 是的,发生了。我也是——在做 c# 一段时间后回到 c 时
    【解决方案3】:

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

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

    更新

    您可以环绕 while 循环来搜索字符。

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

    【讨论】:

    • 对不起,我的例子真的很糟糕。这不是我的意思——请阅读我更新的示例。
    【解决方案4】:

    看到这个 (*chrptr)++;工作正常,但这将增加 chrptr 指向的数组的第一个字符。 在您的情况下,您正在使用类似

    的语句

    char *chrptr = "垃圾";

    这里 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)++ 会工作。希望这会对你有所帮助。祝你好运:)

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2016-01-27
      • 2013-02-23
      • 2018-05-14
      相关资源
      最近更新 更多