[OI] 指针与迭代器

取地址与解引用

一般来说,我们有一个取地址符 & 可以返回该变量的地址.

int main(){
	int a;
	cout<<&a;
}
0x6ffe1c

如果我们现在有一个地址,我们还可以对它进行解引用 *,来返回这个地址上的值.

int main(){
	int a=5;
	cout<<&a<<endl;
	cout<<*(&a);
}
0x6ffe1c
5

从这里可以看出,取地址与解引用是互为逆运算的.

指针变量即是存储地址的变量,它的类型取决于它指向的变量是什么.

显然,一个变量和它的指针变量间的转化,就是通过取地址与解引用这两个操作.

int main(){
	int a=5;
	int* p=&a;
	cout<<p<<endl;
	a=*p;
	cout<<a<<endl;
}
0x6ffe1c
5

小叙 对于指针变量的定义

指针变量定义时的 * 是跟着变量名的,也就是说,如果你使用

int* a,b,c;

你只会定义一个指针变量和两个整型变量.

此外,你可以通过给指针赋地址和给指针的解引用赋正常值两种办法来赋值.

int main(){
	int a=5;
	int *p1,*p2;
	*p1=a;
	p2=&a;
}

箭头取地址符

假设我们有这么一个结构体

int main(){
	struct hdk{
		int a,b;
	};
	hdk *p=;
}

那么我们想调用这个结构体里的变量,恐怕就要这么写了:

(*p).a=1;

因此,箭头符号应运而生

p->a=1;

我们还可以直接用指针变量直接存储值.

int main(){
	struct hdk{
		int a,b;
	};
	hdk *p;
	*p=hdk{1,2};
	cout<<p->a<<" "<<p->b;
}

数组指针与指针的运算

当一个指针被定义在数组中时,它就具有了运算的意义. 一般我们使用的有加法和减法,在指针中分别用来表示上一位和下一位.

int main(){
	int a[5]={1,2,3,4,5};
	int *p=a;
	for(int i=1;i<=5;++i){
		cout<<*p<<" ";
		p++;
	}
}
1 2 3 4 5

另外地,还有指针与指针的减法,可以用来获取两个指针间的距离.

int main(){
	int a[5]={1,2,3,4,5};
	int *p=a,*p0=a;
	for(int i=1;i<=5;++i){
		p++;
	}
	cout<<p-p0<<" "<<p0-p<<endl;
}
5 -5

迭代器

迭代器的本质也是指针,不过是stl的指针.

定义方法:STL类型 ::iterator

int main(){
	vector<int> a{1,2,3,4,5};
	vector<int>::iterator p;
	for(p=a.begin();p!=a.end();++p){
		cout<<*p<<" ";
	}
}
1 2 3 4 5

值得一提的是,.begin().end() 也是指针,一个是容器第一个数的地址,一个是最后一个数的下一个地址.

函数指针

假如几个函数参数相同,就可以通过函数指针替换.

以两个 (int,int) 函数为例.

int(*hdk)(int,int);
int test1(int a,int b){return a+b;}
int test2(int c,int d){return c*d;}

int main(){
	int x,y;
	cin>>x>>y;
	if(x>0){
		hdk=test1;
	}
	else{
		hdk=test2;
	}
	cout<<hdk(x,y);
}

指针批量申请与指针的删除

    struct a{
	    int x,y;
    };
    a* p=new a{1,2};
	delete p;
	int *e=new int[114];
	delete[] e;
posted @ 2024-06-07 11:50  HaneDaniko  阅读(101)  评论(4编辑  收藏  举报