不理解使用++和 - 的指针算法

时间:2011-11-21 16:53:01

标签: c++ memory pointers

所以,我正在通过http://cplusplus.com/doc/tutorial/pointers/学习指针,我对指针算术部分一无所知。有人可以清理一下或指出我可能更好理解的教程。

我特别对所有括号内容感到困惑,例如*p++(*p)++*(p++)等之间的区别。

4 个答案:

答案 0 :(得分:4)

*p++

对于这个,++的优先级高于*,因此它将指针递增1,但检索原始位置的值,因为post-increment返回指针然后递增其值。 / p>

(*p)++

这会强制优先于另一个方向,因此首先取消引用指针,然后将该位置的值加1(但返回原始指针位置的值)。

*(p++)

这个首先递增指针,使其与第一个指针的作用相同。

需要注意的一点是,指针增加的数量受指针类型的影响。从您提供的链接:

char *mychar;
short *myshort;
long *mylong;

char的长度为一个字节,因此++将指针增加1(因为指针指向每个字节的开头)。

short的长度为两个字节,因此++将指针增加2,以便指向下一个短字的开头而不是下一个字节的开头。

long长度为4个字节,因此++将指针增加4。

答案 1 :(得分:1)

几年前我发现有一个解释strcpy,来自Kernighan / Ritchie(我现在没有文本,希望代码准确):cpy_0,cpy_1,cpy_2都等同于strcpy:

char *cpy_0(char *t, const char *s)
{
    int i = 0;
    for ( ; t[i]; i++)
        t[i] = s[i];
    t[i] = s[i];
    i++;
    return t + i;
}
char *cpy_1(char *t, const char *s)
{
    for ( ; *s; ++s, ++t)
        *t = *s;
    *t = *s;
    ++t;
    return t;
}
char *cpy_2(char *t, const char *s)
{
    while (*t++ = *s++)
        ;
    return t;
}

答案 2 :(得分:0)

*p++

返回内容 * p ,然后增加指针的值(postincrement)。例如:

int numbers[2];
int *p;
p = &numbers[0];
*p = 4;        //numbers[0] = 4;
*(p + 1) = 8;  //numbers[1] = 8;
int a = *p++;  //a = 4 (the increment takes place after the evaluation)
               //*++p would have returned 8 (a = 8)
int b = *p;    //b = 8 (p is now pointing to the next integer, not the initial one)

关于:

(*p)++

它增加了内容的值, * p = * p + 1;

(p++); //same as p++

增加指针,使其指向声明指针时定义的下一个元素(可能不存在)。

答案 3 :(得分:0)

首先,您必须了解后期增量的作用;
后增量,将变量增加一个 BUT 表达式(p ++)返回要在表达式其余部分中使用的变量的原始值。

char   data[] = "AX12";
char* p;

p = data;
char* a = p++;

// a -> 'A'  (the original value of p was returned from p++ and assigned to a)
// p -> 'X'

p = data;   // reset;
char  l =  *(p++);

// l =  'A'. The (p++) increments the value of p. But returns the original
             value to be used in the remaining expression. Thus it is the
             original value that gets de-referenced by * so makeing l 'A'
// p -> 'X'

现在由于运营商优先权:

*p++ is equivalent to *(p++)

最后我们有一个复杂的:

p = data;
char m = (*p)++;

// m is 'A'. First we deference 'p' which gives us a reference to 'A'
//           Then we apply the post increment which applies to the value 'A' and makes it a 'B'
//           But we return the original value ('A') to be used in assignment to 'm'

// Note 1:   The increment was done on the original array
//           data[]  is now "BXYZ";
// Note 2:   Because it was the value that was post incremented p is unchaged.
// p -> 'B' (Not 'X')