指针语法混乱

时间:2015-01-29 06:51:52

标签: c arrays pointers

您好我需要编写一个使用过的定义函数,通过该函数我需要提取指定的字符数,虽然我能够做到这一点,但我有一个疑问,我没有得到预期的o / p。

我使用了以下代码,它给出了预期的o / p

#include <stdio.h>

int xleft(const char *s, char *t, int offset)
{
    int i;

    for(i=0;i<offset;++i)
    {
        *(t+i)=*(s+i);  // t[i]=s[i] also worked  which I guess is the 
                        //syntactical sugar for it. Am I rt ? 

    }
    t[i+1]='\0';
    return 1; 
}

int main()
{
    char mess[]="Do not blame me, I never voted VP";
    char newmess[7];
    xleft(mess,newmess,6);
    puts(newmess);
    return 0;
}

但是当我编写像这样的代码时,我无法理解为什么我没有得到o / p

#include <stdio.h>

int xleft(const char *s,char *t, int offset)
{
    int i;

    for(i=0;i<offset;++i)
    {
        *t++=*s++;
    }
    t[i+1]='\0';

    return 1; 
}
int main()
{
    char mess[]="Do not blame me, I never voted VP";
    char newmess[7];
    xleft(mess,newmess,6);
    puts(newmess);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

  

t [i] = s [i]也工作,我猜它是它的语法糖。   我是吗?

是的,你是对的s[i] = *(s+i);

在第二个代码片段中,您正在移动指针t,现在只需执行

*t = '\0';

而不是

t[i+1] = '\0'; /* Which is array out of bound access */

答案 1 :(得分:1)

*(t+i)=*(s+i);  // t[i]=s[i] also worked  which I guess is the 
                   //syntactical sugar for it. Am I rt ? 
确实你是。 C中的pointer[index]相当于*(pointer + index)

但是,它与此不一样:*t++=*s++;。在这里,您正在改变您的实际指针。因此,指针t的新值将为t + i。这就是为什么t[i + 1]t的原始值而言变为*(t + i + i + 1),这绝对不是您想要的。

答案 2 :(得分:0)

在新代码t[i+1]中,(大约)等同于旧代码中的(t+i)[i+1](或t[i + i + 1])。