*与const
void func1(int* const p)
{
*p = 0;
// p++; //const修饰的是指针本身,不能修改指针的地址
}
void func2(const int* p)
{
//*p = 0; //const修饰的是指针所指向的数据,不能修改数据
p++;
}
void func3(const int* const p)
{
//指针本身和数据都被const修饰,都不能修改
//*p = 0;
// p++;
}
void func4(int* p)
{
//都可以修改
*p = 0;
p++;
}
*与++
*p++
int main(void)
{
int a[10] = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
int* p = a;
printf("Before: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("p points to address: %p\n", (void*)p);
int b = *p++;//等价于 int b = *(p++); 先取p指向的值赋给b,然后p自增,指向下一个元素
printf("After: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("b=%d\n", b);
printf("p points to address: %p\n", (void*)p);
return 0;
}
运行结果

++*p
int main(void)
{
int a[10] = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
int* p = a;
printf("Before: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("p points to address: %p\n", (void*)p);
int b = ++*p;//等价于 int b = ++(*p); 先取p指向的值进行自增,然后将自增后的值赋给b
printf("After: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("b=%d\n", b);
printf("p points to address: %p\n", (void*)p);
}
运行结果

*++p
int main(void)
{
int a[10] = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
int* p = a;
printf("Before: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("p points to address: %p\n", (void*)p);
int b = *++p;//等价于 int b = *(++p); 先让p自增,指向下一个元素,然后取该元素的值赋给b
printf("After: a[0]=%d, a[1]=%d\n", a[0], a[1]);
printf("b=%d\n", b);
printf("p points to address: %p\n", (void*)p);
}
运行结果

*与.
int main(void)
{
struct Point p1 = {0, 0};
struct Point* p2 = &p1;
// *p2.x = 30; // 错误用法, .运算符优先级高于*
(*p2).x = 10; // 正确用法
p2->y = 20; // 正确用法
printf("p1.x=%d, p1.y=%d\n", p1.x, p1.y);
return 0;
}
运行结果
