【原创】【考法总结】指针*与++结合的题目考法总结

代码均已调试出结果,放心食用,大致总共5种考法
【理论铺垫】①a[i]恒等价于(a+i)即*(&a[0]+i);i类似偏移量(别忘a代表数组首元素地址即&a[0])
②*(&a[i])恒等价于a[i]:&a[i]表示a[i]的地址,(&a[i])表示取出a[i]地址里的具体数据,即a[i]本身
③地址取值符
的优先级与自增符++相同,此时从右往左看优先级

#include

int main() {
    int a[10]={11,12,13,18,10};
    int *p=&a[2]; //此处*p表示a[2]地址 
    printf("%d\n",p); //p表示a[2]的地址,输出7011624 
    printf("%d\n",*p);//此处*p表示a[2]地址存放的值,即*(&a[2])=a[2]=13 
    
//    *p++; //情况1.等价于*(p++);p为7011628,*p为18 【解释】p指针先向后移一个地址(int是4字节),移到a[3]的地址&a[3],再通过*取出a[3]地址中的元素即a[3]本身,即*(&a[3])=a[3]=18 
//	*++p; //情况2.等价于*(++p);p为7011628,*p为18【解释】原理大致同1→改编:++*++p时 p为7011628,*p为19;注意没*++p++编译错误  
	++*p; //情况3.优先级右往左看即++(*p),p为7011624,*p为14 【解释】*p=a[2]=13,++后*p变为14;而未改变p的值 
		  //【总结】情况123的优先级:地址取值符*的优先级与自增符++相同,此时从右往左看优先级
	
//	*p=*p+1; //情况4.p为7011624,*p为14 【解释】*p即a[2]所在地址的元素,即a[2]本身也即*(&a[2])=a[2]=13.在加1变成14;p不变的原因是此语句仅修改了*p的值,p的值未改 
			 //[tips]p的值为地址,*p的值为地址中的具体元素值 
//	*p=*(p+1); //情况5.p为7011624,*p为18 【解释】p指针先向后移动一个地址,移后指针p的值为a[3]的地址即&a[3],然后*作用后取出a[3]地址中的元素即a[3]本身,
			   //即*(&a[3])=a[3]=18;p不变的原因是此语句仅修改了*p的值,p的值未改 		  
    printf("p=%d\n*p=%d",p,*p); 

    return 0;
}


你可能感兴趣的:(算法,数据结构,c语言)