【C/C++】分析【*a++; *++a; (*a)++; ++(*a)】问题

一、快速一览

*a++

  • 先解引用,后指针自增
  • 改变指针指向,指向自增后的地址

*++a

  • 指针自增,后解引用
  • 改变指针指向,指向自增后的地址

(*a)++

  • 先解引用,后将指针所指自增
  • 不改变指针指向

++(*a)

  • 先将指针所指自增,后解引用
  • 不改变指针指向

二、详解

1. 运算符(*、++/–)

1.1 解引用运算符 (*)

*操作符一般用于两个场景,分别为定义指针变量,或者获取指针所指位置的值。
#include <stdio.h>
int main() {
	int x = 1;
	int* p = &x; // p为int*类型,所存储的值为x的地址
	printf("%d", *p); // 输出:1
	// *p:获取地址p处所存储的值,使用int类型解码(因为定义的是int*)
	return 0;
}

1.2 自增/自减运算符 (++/–)

++和--操作符有两种使用形式,分别为前置和后置使用。前置使用会先修改值后使用值,后置使用会先使用值后修改值。
此为一般理解,具体逻辑需要考虑运算符的结合方向
在本文问题中,要注意++运算符所结合的对象,判断对象是指针还是所指向的值
#include <stdio.h>
int main(){
	int a = 1, b = 1;
	int x1 = a ++ ;
	int x2 = ++ b;
	printf("%d %d %d %d\n", a, b, x1, x2);
	/* 输出
	2 2 1 2
	*/
}

2. 代码演示

在本文中,将结合代码来解释这四条语句,首先定义了a为指向arr数组的1号下标的指针。

2.1 参数定义

#include <stdio.h>
int main() {
	int arr[] = { 1, 3, 5 };
	int* a = arr + 1;
	printf("addr(arr) = %x\na = %x\n*a = %d\n", arr, a, *a);
    /* 输出 地址会有所不同,但差值一定为4,sizeof(int) = 4
    addr(arr) = 99b1f8a8
    a = 99b1f8ac
    *a = 3
    */
	return 0;
}

2.2 代码注释

// *a++ 
#include <stdio.h>
int main() {
	int arr[] = { 1, 3, 5 };
	int* a = arr + 1;
	*a++ = 2; // ***区别行***
	// 此时arr更新为 {1, 2, 5},
	// a 指向 arr+2 (i.e. *a == 5)
	for (int i = 0; i < 3; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n%d\n", *a);
	/* 输出
	1 2 5
	5
	*/
	return 0;
}
// *++a
*++a = 2;
// arr 更新为 {1, 3, 2},
// a 指向 arr+2 (i.e. *a == 2)
// (*a) ++ 
int b = (*a)++;
// arr 更新为 {1, 4, 5},
// a 指向不变为 arr+1 (i.e. *a == 4)
// b 的值为修改前的值 3 
// (*a) ++ 
int b = ++(*a);
// arr 更新为 {1, 4, 5},
// a 指向不变为 arr+1 (i.e. *a == 4)
// b 的值为修改后的值 4 

2.3 使用场景

  • 在底层编程,如嵌入式、驱动开发等,直接操作指针和内存能有效提高程序效率
// 给数组赋值
while(cnt){
	*pArr++ = x;
	cnt -- ;
}
  • 面试和考试
  • ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值