IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> <<<关于C++中指针的基本知识>>> -> 正文阅读

[数据结构与算法]<<<关于C++中指针的基本知识>>>

这篇不和<<<零基础c++速成>>>衔接,

主要是针对指针单独分析


目录

1. 指针

1.1 指针的概念

1.2 指针的操作

1.2.1 &变量名

1.2.2 *(指针变量)

1.3 指针的运算

1.3.1 指针的赋值运算

1.3.2 指针的算数运算

1.4 指针与数组

1.4.1 指针与数组的关系

1.4.2 使用指针访问数组


1. 指针

1.1 指针的概念

指针是一种特殊的变量,指针就是用来存放地址的,即指向内存中的某个单元的地址值。

定义规则如下

<类型标识符> * 指针变量名

例如

int * p;  //声明指针p用于指向int型数据
char *a;  //声明指针a用于指向char型数据

这里说明一点,char型的指针一般不用于指向char型变量,

而是用于指向char型数组,即字符串中。

1.2 指针的操作

1.2.1 &变量名

“&”为取地址运算符,根据前面的定义,指针就是用来存放地址的,

则&就是用来获取变量的地址的。比如说

int i = 5;  //变量
int *p;     //指针变量
p = &i;    //把变量i的地址赋给指针p

1.2.2 *(指针变量)

*也叫指向运算符,*与指针变量组合,

用来获取指针变量指向的那个地方的值,即p保存的地址处的值。

取地址运算符和指向运算符优先级高于所有二元运算符。

int i=1,j;
int *p;       //定义指针变量
p = &i;       //将i的地址赋给指针p
j = *p;       //*p即,取p处地址的值,赋给变量j

//特别注意第二行和第四行的 *p
//两个不一样,第二行是定义变量p,第四行是取出指针变量指向的值

1.3 指针的运算

1.3.1 指针的赋值运算

就提醒大家一点,指针所赋的值必须是同类型的变量地址

比如说int型变量的地址只能赋值给int型指针,切不可乱搭。

比如说

int *p;
char c ='a';
p=&C;  //这是错误的,不能乱搭配,只能同类型指针和同类型变量赋值。

1.3.2 指针的算数运算

对于指针的算数运算,只能进行加, 减,和两个指针相减三种运算,

而且两个指针变量的相减也只能运用在同类型的指针之间。

那么指针的加减又是什么呢?

毫无疑问,根据指针的定义,指针是用来存放地址的,

所以指针的相加减,实际上就是地址上的加减。

int i =1;
//比如说定义一个int型指针
int *p;
p = &i;
//对指针加1
int *a;
a=p+1;
//则指针+1表示int型指针,你该指向下一个元素了
//又因为int占4个字节,所以此时指针所存放的地址值加4

不理解没关系,只需要记住,指针加一就是指向该元素的下一个元素

加2指向下下个元素即可,就是这么简单。

1.4 指针与数组

1.4.1 指针与数组的关系

数组在内存空间中实际上是一个连续的空间,存储着同一类型的数据

如果你知道了数组的第一个数字的地址,那么指针就可以帮你把数组里全部的元素拿出来,

只需要简单的++,就可以

比如说

int a[3] = {1,2,3};
int * p;
p = &a[0]; //把数组的首地址赋给指针p

有了数组的首地址,那么根据前面讲的指针的加减,我们是不是就可以把数组中的数都拿出来了

int a[3] = {1,2,3};
int * p;
p = &a[0]; //把数组的首地址赋给指针p
for (int i = 0; i<3; i++)
    cout<< *(p+i);      
/*
运用取值符号和循环对指针进行加法运算,
*p  第一个元素的值
*(p+1)第二个元素的值
*(p+2)第三个元素的值
就这样,通过数组的首地址就把数组中的所有元素都取出来了
*/

其实,我们所知道的数组,本身就是一个指针

a[3]={1,2,3},a就是指针,他就指向这组连续空间的首地址

所以:

p = &a[0]? 等价于 p = a

当你们要取出数组中某个地方的值的时候

是不是需要语句v = a[1]这样取出第二个元素的值啊

如果是指针就像上面的例子 ,就是*(p+1)

综合上面的,其实指针和数组是等价的,根据上面的例子

语句:

v = a[1]? 等价于 v = *(p+1)
?

大家记得这两个等价式,还有牢记指针的本质啊

1.4.2 使用指针访问数组

就如我上面讲的,其实数组名就是一个指向数组元素首地址的指针

int a[10];

有 a[i]?等价于 * ( a+i)

只要知道指针的首地址,就能把数组中的任意数都访问出来

先上例题

#include<iostream>
using namespace std;
int sum(int* p, int n);
int main()
{
	int arr[5] = { 1,2,3,4,5 };  // 定义一个数组
	cout << sum(arr, 5);   //arr数组名本身就是指针,且指向首地址,作为参数传入
}
int sum(int* p, int n)  //定义一个函数,且以指针为参数传入函数中
    // 上面等同于 int sum(int arr[], int n)
{
	int sum_;
	for (int i = 0; i < n; i++)
	{
		sum_ += *(p + i);  //这里等价于 sum += * p[i]
	}
	return sum_;
}

再来举个例子,我们用顺序排序

#include<iostream>
using namespace std;
void order(int* p, int n)  //等价于 void order(int arr[], int n)
{
	int i, j, k, t;   //定义4个变量,两个比较,一个标记最小,一个进行交换
	for (i = 0; i < n - 1; i++)
	{
		k = i;   //假设 i 为最小
		for (j = i + 1; j < n; j++)  //取j=i+1,即i的后一个元素
		{
			if (*(p+k) > *(p + j))  //上一步标记的最小与后一个进行比较,如果j个小于最小
				k = j;               //满足,最小标记为j
		}
		if (k != i)     //通过上面循环找到最小,如果第一步假设k=i不成立,说明有比i更小的,则交换 i  和最小的位置
		{
			//交换
			t = *(p + i);
			*(p + i) = *(p + k);
			*(p + k) = t;
		}
	}
}
int main()
{
	int a[4] = { 6,5,2,3 };
	order(a, 4);                   //a相当于指针,指向的是数组a[4]的首地址,即a[0]
	cout << "排序后的数组为:";
	for (int i = 0; i < 4; i++)    //循环输出排序后数组
	{
		cout << a[i] << " ";
	}
}

/*
输出结果为:
排序后的数组为:2 3 5 6
*/

指针最关键的就是,记住,指针是存放变量地址的

指针? ? ? 存放? ? ?地址!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:57:48  更:2021-12-01 17:58:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:43:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码