指针学习总结

最近在学C++的数据结构,但是发现很多都有用到指针,而…作为小白的我,真的感觉好难,所以现在打算回头复习一下指针,并将复习知识点和心得总结一下并记录下来>-<
1.指针其实就是地址,基本概念:一个变量的地址称为该变量的指针,而如果有一个变量是专门用来存放地址(即指针)的,则它称为指针变量
2.在c++中 *表示指向,如i是一个指针变量,而*i表示i所指向的变量
3.定义指针变量
一般形式:基类型*指针变量名 如:
float *pointer; //定义pointer为指向float型数据的指针变量
char *pointer; //定义pointer为指向char型数据的指针变量
注意:*不是指针变量名的一部分,在前面加*表示该变量为指针变量而已,在定义指针变量的时候要必须指定基类型!!!
4.赋值:既然要用到地址,但是我们又看不到变量的地址,那么我们怎么知道变量的地址呢?在C++我们可以用“&”来获取变量的地址,如:
int i;
int *pointer=&i; //这样pointer就取到变量 i 的地址啦
注意:
a. 一个指针变量只能指向同一个类型的变量,如不能忽而指向一个整型变量,忽而指向一个双精度型变量
b.如果已执行“pointer = &a”那么&*pointer表示&a(思考下为什么)
c. *&a又表示什么?
举个小小的例子来体验一下:
题目:输入a,b两个整数,按先后大小输出a和b。
分析:如果不用指针的话就是直接比较输入的两个数,比较大小即可,而指针其实也是这个思路,就是比较后可以用指针来交换。

int *p1,*p2,*p,a,b;
cin>>a>>b;
p1 = &a;
p2 = &b;
if(a<b)   //如果a<b就将p1的指向与p2的指向交换
{
	p=p1;
	p1=p2;
	p2=p;
}
cout<<"max="<<*p1<<"min="<<*p2<<endl;

以上都是些很基础的知识,那么下面开始对我来说就是有点难理解而且复杂的了

5.指针作为函数参数
上面的例子也可以用指针作为形参来实现:

int main()
{
void swap(int*p1,int*p2);  //函数声明
int *pointer_1,*pointer_2,a,b;
cin>>a>>b;
pointer_1 = &a;   //使pointer_1指向a
pointer_2 = &b;    //使pointer_2指向b
if(a<b)
swap(pointer_1,pointer_2);
cout<<"max=" <<a<<"min"<<b<<endl;
return 0;
}
void swap(int*p1,int*p2)  //交换函数
{  
	int temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
}
/**注意swap函数不能写成以下两种*/
void swap(int a,int b)
{
int temp;
temp = a;
a=b;
b=temp;
}
void swap(int*p1,int*p2)  //交换函数
{  
	int *temp;
	*temp=*p1;
	*p1=*p2;
	*p2=temp;
}

6.1数组和指针
指针变量既可以指向变量,也可以指向数组元素(把某一元素放到一个指针变量中)
所谓数组元素的指针就是元素的地址

int a[10];  //定义一个整型数组a,它有10个元素
int *p;      //定义一个基类型为整型的指针变量p
p = &a[0]; //将元素a[0]地址赋值给指针变量p,使p指向a[0]

在C++中,数组名代表数组中第一个元素的地址
int *p = &a[0];int *p = a;作用相同
6.2 通过指针引用数组元素
int *p = &a[0]; *p = 1; //赋值给a[0]
如果指针变量p以指向数组中的一个元素,则p+1指向同一数组中的下一个元素
至此为止,学习了两种引用数组元素的方法:
(1)下标法,如a[i]形式;
(2)指针法,如*(a+i)或*(p+i)
6.3用指针变量作函数参数接收数组地址
前面我们知道可以用数组名作函数的参数,而数组名代表数组首元素的地址。用数组名作函数的参数,传递的是数组首元素的地址。很容易推想,用指针变量做函数形参,同样可以接收从实参传递来的数组首元素的地址
void select_sort(int *p,int n);
select_sort(a,10);
6.31 多维数组元素的地址
以二维数组为例
int a[3][4] 表示a数组含有三个一维数组,每个一维数组都四个元素,如下图:
在这里插入图片描述
如何通过指针获取二维数组的值?
下面是获取二维数组指针的方法
在这里插入图片描述
用指针法表示二维数组元素地址
在数组a中,0行1列元素a[0][1]的地址可以直接写成&a[0][1]
也可以用指针法表示:
a[0]+1表示a[0][1]中的元素
a[0] == *(a+0) ==*a,所以a[0]+1 == *(a+0) + 1
更一般地,i行j列元素a[i][j]的地址表示为: a[i]+j == *(a+i)+j

6.4字符串与指针
在C++中可以用3种方法访问一个字符串
a.用字符数组存放一个字符串

int main()
{
char str[] = " I love China!";
cout << str << endl;
return 0 ;
}

b.用字符串变量存放字符串

int main()
{
string str[] = " I love China!";
cout << str << endl;
return 0 ;
}

c.用字符指针指向一个字符串

#include <iostream>
using namespace std;
int main()
{
char *str = "I love China!";
cout << str << endl;
return 0;
}

6.5函数指针
函数指针顾名思义就是指向函数的指针,可以通过指针来调用函数。
函数也有地址:函数地址是储存其他机器语言代码的内存开始地址
好处:可以在不同的时间使用不同的函数
函数指针的声明:
int (*p)(int,int) //该语句声明了一个指针指向一个函数
注意:int *p(int,int)不是函数指针,而是声明了一个函数p,返回int * 类型
6.6 指针数组和指向指针的指针
指针数组
如果一个数组,其元素均为指针数据类型,该数组称为指针数组,也就是说指针数组中的每一个元素相当于一个指针变量,它的值都是地址。
定义一维数组
int *p[4];
指向指针的指针
即指向指针数据的指针
定义一个指向指针数据的指针变量
char *(*p) 也可写成 char **p
在这里插入图片描述
运行结果: C++,C

下面总结一下指针的类型和运算
有关指针的数据类型在这里插入图片描述

参考资料:谭浩强版C++程序设计,老九学堂C++入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyzy_czh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值