数组与指针:(Important)
-
数组元素的地址:(如何使用指针来存储数组元素的地址呢?)
int num[100] = {0}; int* p_num[100] = {0}; for(int idx = 0; idx < 100; ++idx) { p_num[idx] = &num[idx]; }
这样的操作没有任何语法或者逻辑错误,但是我们Duck不必如此麻烦。
-
数组名就是数组首地址:
①为了避免上面说的情况,C/C++中规定数组名字就是数组的首地址。注意,是数组的首地址,也就是数组的第0个元素的地址,即:
int num[100] = {0}; int* pnum = &num[0]; //这里的 num 和 pnum 的值应该是一样的
②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 * const 类型的,也就是说不能改变其存储的地址。
不过,可以做如下操作:int num[100] = {0}; int* pnum = num; //(定义一个新指针pnum,自由指向(存储)地址)
这里的 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) -
练习:
-
定义两个字符数组输入如下:
char str1[50] = {0}, str2[] = “I Love C++!”;
用指针的方式,实现将 str2 拷贝到 str1 中。#include<iostream> using namespace std; void arycp(char* str1 ,char* str2) { for(;*str2 != 0;) { *str1++ = *str2++; } } int main() { char str1[50] = {0} ,str2[] = "I Love C++!"; arycp(str1 ,str2); return 0; }
-
输入一个字符串,例如:
a123x456__17960?302ab5876
将其中连续的数字作为一个整数,依次存放到一个数组中a中,例如:123放在a[0]中,456放在a[1]中。统计共有多少个整数,并输出这些整数#include<iostream> using namespace std; //未写完 void find_num(int* ary_num ,char* ary_str) { while(*ary_str != 0) { if(48 <= *ary_str && *ary_str<57) { cout << "ary_atr = "<< *ary_str <<endl; *ary_num++ = (*ary_str-'0'); } ary_str++; } } int main() { int ary_num[50] = {0}; char* ary_str = "a123x456__17960?302ab5876"; find_num(ary_num ,ary_str); for(int i=0;i<50;i++) cout << ary_num[i] <<endl; return 0; }
-