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

本文转载自:VC驿站

https://www.cctry.com/thread-289319-1-1.html

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]中。统计共有多少个整数,并输出这些整数。

第23课视频教程下载地址:

https://www.cctry.com/thread-289319-1-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值