我刚开始学习C,在做一个将指针作为函数参数传递给指针的例子时,我发现了一个问题。
这是我的示例代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int* allocateIntArray(int* ptr, int size){
if (ptr != NULL){
for (int i = 0; i < size; i++){
ptr[i] = i;
}
}
return ptr;
}
void increasePointer(int** ptr){
if (ptr != NULL){
*ptr += 1; /* <----------------------------- This is line 16 */
}
}
int main()
{
int* p1 = (int*)malloc(sizeof(int)* 10);
allocateIntArray(p1, 10);
for (int i = 0; i < 10; i++){
printf("%d\n", p1[i]);
}
increasePointer(&p1);
printf("%d\n", *p1);
p1--;
free(p1);
fgets(string, sizeof(string), stdin);
return 0;
}
当我将*ptr+=1
修改为*ptr++
时,问题发生在第16行。预期的结果应该是整个数组和数字1,但是当我使用*ptr++
时,结果是0。
+=1
和++
之间有什么不同吗?我以为他们两个是一样的。
发布于 2016-02-10 11:45:40
差异是由于运算符的优先顺序造成的。
与取消引用操作符*
相比,后增量操作符++
具有更高的优先级。所以*ptr++
等同于*(ptr++)
。换句话说,post增量修改的是指针,而不是它所指向的对象。
赋值运算符+=
的优先级低于取消引用运算符*
,因此*ptr+=1
等效于(*ptr)+=1
。换句话说,赋值运算符会修改指针所指向的值,而不会更改指针本身。
发布于 2016-03-08 09:52:14
*ptr += 1: ptr指向的增量数据。*ptr++:指向下一个内存位置的增量指针,而不是指针所指向的数据。
https://stackoverflow.com/questions/35306391
复制相似问题