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

代码均已调试出结果,放心食用,大致总共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]本身
p++ = *(p++) ≠ ++p =(p+=1)
【说明】*p++ = (p++)都是先执行p,再p++(即先取值,再指针后移);而 ++p和(p+=1)是先指针后移,再取值
·共性发现:下面的情况123好像都有去括号性?!!→就是“等价于”后面的指针括号可以掉后效果一样

#include<stdio.h>

int main() {
    int a[10]={11,12,13,18,10};
    int *p=&a[2]; //此处int后的*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再p++;下面printf输出p为7011628,*p为18 【解释】p指针先取值再后移指向a[3](int是4字节)
//	*++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;
}

### CSP 考试中 `vector` 的考察方式 #### 一、背景介绍 CSP(Certified Software Professional)考试注重考查考生的基础编程能力算法设计能力。其中,STL 容器类如 `vector` 是常见的考点之一。由于其动态数组特性以及丰富的成员函数支持,`vector` 常被用于解决涉及数据存储、操作查询的问题。 --- #### 二、常见题型分析 1. **基本功能应用** - 题目可能要求实现简单的增删查改操作,例如向容器中插入元素、删除指定位置的元素或查找特定条件下的值。 - 示例代码如下: ```cpp #include <iostream> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(1); v.emplace_back(2); for(auto& num : v){ cout << num << " "; // 输出:1 2 } return 0; } ``` 2. **复杂逻辑处理** - 结合其他 STL 容器或者自定义结构体使用 `vector` 进行多维度的数据管理。 - 可能会涉及到排序、去重等功能的应用[^1]。 - 示例代码展示如何利用 `sort()` `unique()` 函数完成对 `vector` 中重复项的清理工作: ```cpp #include <algorithm> #include <vector> #include <iostream> using namespace std; int main(){ vector<int> vec = {4, 7, 8, 4, 9}; sort(vec.begin(), vec.end()); // 排序以便后续 unique 使用 vec.erase(unique(vec.begin(), vec.end()), vec.end()); for(auto it = vec.begin(); it != vec.end(); ++it){ cout<< *it << ' '; // 输出:4 7 8 9 } return 0; } ``` 3. **性能优化考量** - 对于大规模数据场景下,合理设置初始容量可以有效减少内存分配次数从而提升效率。 - 下面的例子展示了预先预留空间的重要性: ```cpp void fillVector(vector<int>& v, size_t count){ v.reserve(count); // 提前申请足够的连续内存区域 for(size_t i=0;i<count;++i){ v.push_back(i*i); } } ``` 4. **嵌套结构迭代访问** - 当遇到二维甚至更高维数的情况时,需掌握正确初始化方法及其遍历技巧。 - 如何通过双重循环来打印一个由多个整数列表构成的一组数据? ```cpp #include <vector> #include <iostream> using namespace std; int main(){ vector<vector<int>> matrix{ {1, 2}, {3, 4} }; for(const auto& row : matrix){ for(const auto& elem : row){ cout << elem << "\t"; // 按行列顺序依次输出各元素 } cout << endl; } return 0; } ``` 5. **结合实际问题求解** - 类似最大子序列等问题可以通过维护临时变量配合 `vector` 来高效解答。 - 给定一组正负混合数值寻找最优组合实例演示: ```cpp double maxSubArraySum(const vector<double>& nums) { if(nums.empty()) return 0.0; double current_sum = nums[0]; double best_sum = nums[0]; for (size_t i = 1; i < nums.size(); ++i) { current_sum = max(nums[i], current_sum + nums[i]); best_sum = max(best_sum, current_sum); } return best_sum; } ``` --- #### 三、总结建议 针对上述提到的各种形式,在备考过程中应当着重练习以下几个方面的能力训练: - 熟悉常用接口调用语法; - 加强对于异常情况预判意识培养; - 注重时间复杂度评估并选取合适策略应对不同规模输入需求; 同时也要注意审清题目描述细节部分,比如索引是从零还是从一开始计数等容易忽略之处[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值