所以,我正在通过http://cplusplus.com/doc/tutorial/pointers/学习指针,我对指针算术部分一无所知。有人可以清理一下或指出我可能更好理解的教程。
我特别对所有括号内容感到困惑,例如*p++
,(*p)++
,*(p++)
等之间的区别。
答案 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')