指针

指针

作为一个(OI)选手,首先我们就应该_学习_ C++,而这些语言一定是有差异的 ,但是他们差在哪呢,C++最让人感到特殊的地方就是他有指针,而指针也往往是令OI选手头疼的地方。

定义

指针,顾名思义就是就是一个(----->) ,这个定义简单但是却并不好理解,主要是他的定义太广泛了且用(fa)太多,导致令人难以调试代码。这么(毒瘤)的东西,不用可不可以,当然可以。只是,有的时候你不得不用它,最典型的例子就是如果有一天你忘写平衡树了,那该怎么办,笨的人就会写暴力,聪明但不会指针的人会查看STL里的map,想调用红黑树,然后啥也看不懂,然后回来写暴力。但是聪明的人就会机智的调用STL(不可能的)。

以上情况并不少见,且会了指针还可以进行一些比较_秀_的操作,因此指针对于一个(programmer)来说是非常重要的。

引用

讲到指针就不得不讲到引用了,讲到引用也就不得不讲到取地址符_"&”_这个符号,它可以把一个量的地址给赋值或传递,我们首先要知道一个变量如果仅是赋值给一个数,那仅仅只是在表面上他们相等,但是更深一点来说的话,如果要真正实现两个量完全相等,那必须要使它们的地址也相等。就比如说有的程序在C盘中可以用,但是同样的文件直接复制到D盘就有可能用不了了,所以地址也是非常重要的。但是这个符号不仅仅只是有他的名字里所带有的作用——取地址,还有其他作用比如引用,说到引用,我们先拿一个函数做(example), 最简单的(swap),几乎每个(oier)都写过,但是你有没有深刻理解其中的本质的本质的本质

#include <cstdio>
void my_swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	my_swap(a, b);
	printf("%d %d", a, b);
}

我们就看这个程序,我们打眼一看可能是对的,但是运行出来却不对,主要原因就是我们像是两个程序仅仅之交换了快捷方式,所以依然没有交换他们本质上的东西,因此我们必须把它们更深的东西给交换,这时,就用到了引用,

引用后的代码

#include <cstdio>
void my_swap(int &x, int &y)//关键就是这一步,因为这一步过后我们就相当于进行了新建一个int型变量 x的值 = a的值,然后令x的地址 = a的地址这样一步操作。
{
	int temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	my_swap(a, b);
	printf("%d %d", a, b);
}

引用的格式:
类型名 & 别名 = var;
1.定义的时候必须初始化,即& 前面有类名或类型名,&别名后面一定带 “=” (在= 左边);
2.&后面的别名是新的名字,之前不存在。

&取地址时:

如果&是取址运算符,也就意味着取一个变量的地址并付给指针变量。&后面紧跟的是变量(已存在);

类型

指针按理来说应该也是一个类型,他指向什么,便是什么类型。就是因为这个特点,也导致他在STL里几乎是无处不在,也令他十分灵活。

用法

(fa)就比较广泛了,我如果深刻理解了上文所讲的地址的用法,那这个就很容易理解了,指针可以表示一个变量的地址,那可以进行许多骚操作

比如:

#include <cstdio>
using namespace std;
int main()
{
	int a;
	scanf("%d", &a);
	int* x = &a;
	printf("%d", x);
}

这个小小的程序就可以深刻的反映出指针了,我们可以发现无论输入的a的值是多少都不会影响到指针的值,原因就是a这个变量的地址是在一开始就确定好了的,所以不会随着输入的数值而改变.

但是我们要注意几点就是int* 只是确定了这个变量是一个指针变量,而这个变量以后复制的时候只需要用到字母,而并不需要用到前面的*,

比如说上面那一行还可以这样写

int* x;
x = &a;

所以这也是指针一个很难的地方,就是他设计很不人性化.

指针除了这个作用还可以返回这个指针的值,十分毒瘤的一点就是它返回值时前面需要加上*,就很令人很迷

很容易跟上面搞混,不得不让人喊出****.

指针的主要内容就讲的差不多了,其他的基本就可以由它推出来,但是我觉得指针在(oi)中嘤用更广泛的就是在结构体里的指针了,这时还需要用到箭头 ->这个符号 .

我们如果定义一个结构体指针,然后这个指针再加上箭头指向一个类型就能返回这个结构体里该类型的值

我觉得下文也有比较,如果看不懂可以看下面,就不介绍了.

#include <cstdio>
using namespace std;
struct cym {
	int a, b;
}c;
int main()
{
	scanf("%d%d", &c.a, &c.b);
	cym* x = &c;
	int* a1 = &c.a;
	int* b1 = &c.b;
	printf("%d %d
", x -> a, x -> b);
	printf("%d %d
", *a1, *b1);
    printf("%d %d
", c.a, c.b)//三个表达方式都可以
}
原文地址:https://www.cnblogs.com/liuwenyao/p/9809970.html