指针(二):指针与数组
1.指针与数组的关系
指向数组的指针变量称为数组指针变量。“数组是内存上一块连续的空间”。数组名就是这块连续空间的首地址。
2.指针指向数组
一开始的数组定义与输出:
#include<iostream> #include<cstdio> using namespace std; int main(){ int a[10]; for(int i=0;i<5;i++){ cin>>a[i]; } for(int i=0;i<5;i++){ cout<<a[i]<<" "; } return 0; }
指针操作也可以输入数据:
#include<iostream> #include<cstdio> using namespace std; int main(){ int a[10]; for(int i=0;i<5;i++){ scanf("%d",a+i); //本来写成scanf("%d",&a[i]); } for(int i=0;i<5;i++){ printf("%d ", *(a+i)); // } return 0; }
上面这个操作,本来scanf("%d",&a)写法,其中&是取地址符,a是数组名,本来就表示数组空间的首地址,所以可以直接用。注意,这个地方不能用cin。
数组指向指针操作:
我们可以定义指针变量,让它来指向数组名。
#include<iostream> #include<cstdio> using namespace std; int main(){ int a[10]; int *p=a; for(int i=0;i<5;i++){ scanf("%d",p+i); //本来写成scanf("%d",&a[i]); } for(int i=0;i<5;i++){ printf("%d ", *(p+i)); } return 0; }
2.指针的加减
指针也是变量,可以加减。
#include<iostream> #include<cstdio> using namespace std; int main(){ int a[10]={1,2,3,4,5}; int *pa=a; cout<<a[0]<<endl; //结果是1 cout<<pa<<endl; //0x70fdf0 cout<<*pa<<endl; //结果是1 pa++; cout<<pa<<endl; //0x70fdf4 cout<<*pa<<endl; //2 pa=pa+2; cout<<pa<<endl; //0x70fdfc cout<<*pa<<endl; //4 pa--; cout<<pa<<endl; //0x70fdf8 cout<<*pa<<endl; //3 return 0; }
其他高级操作:
(1)数组名作为指针参数传递
#include <iostream> using namespace std; // 方式1:数组指针 + 大小参数 void printArray(int* arr, int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[5] = {1, 2, 3, 4, 5}; // 数组名自动退化为指针 printArray(arr, 5); return 0; }
(2)使用容器(推荐)
#include <iostream> #include <vector> using namespace std; // 使用 vector void printVector(const vector<int>& vec) { for (size_t i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } cout << endl; } int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); printVector(vec); return 0; }
这里加不加const的区别是:加入const后,原数组不能被修改,是只读状态,如果要赋值会报错