VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 5840|回复: 137

《实用C++》第23课 数组与指针

  [复制链接]
51_avatar_middle
online_admins 发表于 2018-2-23 16:24:33 | 显示全部楼层 |阅读模式
1、必要性:
指针这个东西以后真的是非常常用,所以这里再给大家讲解一下数组和指针的关系,以后也会经常用到啊,所以大家要用心学习!

2、数组元素的地址:
之前给大家讲解了每个变量都有地址,平时如果我们定义了一个变量之后可以用指针保存其地址,如下:
int a = 5;
int* pa = &a;
但如果是数组呢?大家肯定会说数组也是变量,数组中的每个元素也有地址,没错,确实是这样。但是如果一个数组中有上百上千个元素,我要得到每个数组元素的地址,用指针来保存,怎么办呢?
数组中有100个元素你就要定义100个指针,数组中有1000个元素你就要定义1000个元素。不会吧,这么麻烦?有的会员比较聪明,想到了,我可不可以也定义一个指针的数组,用来保存之前那个数组的所有元素的地址呢,答案当然是可以的,如下:
int num[100] = {0};
int* p_num[100] = {0};
for(int idx = 0; idx < 100; ++idx)
{
    p_num[idx] = &num[idx];
}

以上代码行不行?肯定是可以的,但是你不感觉麻烦吗?定义一个数组就要再定义一个指针的数组,而且还要调用循环来初始化给指针赋值,太麻烦了吧,有没有简单的办法呢?

3、数组名字就是数组的首地址:
①、为了避免上面说的情况,C/C++中规定数组名字就是数组的首地址。注意,是数组的首地址,也就是数组的第0个元素的地址,即:
int num[100] = {0};
int* pnum = &num[0];
这里的 num 和 pnum 的值应该是一样的,具体在vs中给大家看下, 具体看视频教程演示!

②、C/C++中规定如果指针变量p已经指向数组中的一个元素,则p+1指向同一数组中的下一个元素的地址(而不是将p的值简单+1),p-1同理。
int num[100] = {0};
int* pnum_0 = &num[0];
int* pnum_1 = &num[1];
pnum_0 += 1;
执行以上代码之后,这里面pnum_0的值应该和pnum_1的值是相等的。

③、所以,根据以上,针对一个数组我们只需要用数组的名字就可以得到数组中的任何一个数组元素的地址了,很方便吧?
int num[100] = {0};
那么这里面 num 就是 num[0]的地址了,即为:&num[0],那么有的会员会说 num += 1,就应该是 num[1]元素的地址了吧。大家把这句放到代码中看看能过吗?
实际上有很多初学者都遇到这个问题了,比如有个网友这几天刚发的帖子:https://www.cctry.com/thread-289301-1-1.html
答案是不行的,数组的名字确实是数组的首地址,可以把他理解为一个指针,但是这个指针是:int * const 类型的,也就是说不能改变其指向的地址。也就是说不能动是固定的。那怎么办呢,不是白费了吗?
没关系,我们可以再定义一个指针,如下:
int num[100] = {0};
int* pnum = num;
这里的 pnum 是可以移动的,所以就可以指向数组num中的任意一个元素喽!例如遍历一个数组:
int num[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int* pnum = num;
for(int idx = 0; idx < 10; ++idx)
{
    cout << *(pnum+idx) << endl;
}

④、访问数组的两种方法:
下标法:num[0];
指针法:*(pnum+idx)

4、用指针操作字符串数组:
定义两个字符数组输入如下:
char str1[50] = {0}, str2[] = "I Love cctry.com!";
用指针的方式,实现将 str2 拷贝到 str1 中。
具体代码见:视频教程!

5、小作业:
输入一个字符串,例如:
a123x456__17960?302ab5876
将其中连续的数字作为一个整数,依次存放到一个数组中a中,例如:123放在a[0]中,456放在a[1]中。统计共有多少个整数,并输出这些整数。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=25
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1cP74mse2X_Nk081xlJ40xg 提取码:hs7g
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第22课 地址与指针
下一篇:《实用C++》第24课 结构体类型
51_avatar_middle
online_vip 发表于 2018-2-24 10:32:56 | 显示全部楼层
支持syc 继续更新
10_avatar_middle
在线会员 发表于 2018-2-24 13:06:22 | 显示全部楼层
继续吧,紧跟老大进度
22_avatar_middle
online_vip 发表于 2018-2-24 20:36:37 | 显示全部楼层
继续来学习
18_avatar_middle
online_vip 发表于 2018-2-24 21:21:40 | 显示全部楼层
学习学习
65_avatar_middle
在线会员 发表于 2018-2-25 09:14:55 | 显示全部楼层
Thanks&#9834;(&#65381;ω&#65381;)&#65417;
74_avatar_middle
在线会员 发表于 2018-2-25 10:31:02 | 显示全部楼层
看看         
94_avatar_middle
online_vip 发表于 2018-2-25 10:58:36 | 显示全部楼层
努力学习 加油吧
13_avatar_middle
online_vip 发表于 2018-2-25 14:20:32 | 显示全部楼层
hello world
50_avatar_middle
在线会员 发表于 2018-2-25 21:28:32 | 显示全部楼层
谢谢。。。
78_avatar_middle
在线会员 发表于 2018-2-25 21:29:33 | 显示全部楼层
又出新课啦,谢谢
80_avatar_middle
在线会员 发表于 2018-2-26 21:37:03 | 显示全部楼层
坚持学习!!
49_avatar_middle
在线会员 发表于 2018-2-27 14:05:50 | 显示全部楼层
gh gh gh
22_avatar_middle
在线会员 发表于 2018-2-27 21:06:12 | 显示全部楼层
感谢楼主分享
60_avatar_middle
online_vip 发表于 2018-2-28 12:09:58 | 显示全部楼层
支持syc 继续更新
98_avatar_middle
在线会员 发表于 2018-2-28 21:06:13 | 显示全部楼层
继续学习


17_avatar_middle
在线会员 发表于 2018-3-1 08:16:30 | 显示全部楼层
继续吧,紧跟老大进度
38_avatar_middle
在线会员 发表于 2018-3-2 20:47:10 | 显示全部楼层
感谢分享
04_avatar_middle
online_vip 发表于 2018-3-3 19:52:39 | 显示全部楼层
谢谢分享
08_avatar_middle
在线会员 发表于 2018-3-3 21:18:26 | 显示全部楼层
《实用C++》第23课 数组与指针
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-20 03:42

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表