// Example program
#include <iostream>
//#include <string>
using namespace std;
int main()
{
const char *cp = "iambang";//cp看作列地址
const char *tmp_p[] = { "aaa","bbb","nng","eee","hhh" };//指针 数组
const char **p = tmp_p;//temp_p看作行地址,p指向的是的行地址
const char tmp[][4] = { "ABC","DEF","GHI","JKL","MNO" };
const char(*kp)[4] = tmp;//数组指针
cout << cp << endl;//输出iambang,列地址直接输出字符串
cout << tmp_p << endl; // 输出00DAFBFC,行地址
cout << &tmp_p[0] << endl;// 输出00DAFBFC,行地址
cout << tmp_p + 1 << endl; // 输出00DAFC00,行地址
cout << &tmp_p[1] << endl;// 输出00DAFC00,行地址
cout << endl;
//tmp_p[0]相当于cp,看作列地址,&列地址=行地址
cout << *tmp_p << endl;//*行地址=列地址,输出aaa
cout << *(&tmp_p[0]) << endl;//*(&列地址)=列地址直接输出字符串常量,输出aaa
cout << *(tmp_p + 1) << endl;//*行地址=列地址,输出bbb
cout << *(&tmp_p[1]) << endl;//*(&列地址)=列地址直接输出字符串常量,输出bbb
cout << endl;
//上面可理解为:先找到行,再换成列地址再换成列地址输出,这样才能输出字符串常量
//tmp_p[0]相当于cp,看作列地址
cout << tmp_p[0] << endl;//输出aaa
cout << tmp_p[1] << endl;//输出bbb
cout << endl;
//p指向的是的行地址
cout << *p << endl; // *行地址=列地址,输出aaa
cout << *(p + 0) << endl;// *行地址=列地址,输出aaa
cout << *(p + 1) << endl;//*行地址=列地址,输出bbb
cout << *(p + 2) << endl; //*行地址=列地址,输出nng
cout << *(p + 3) << endl; //*行地址=列地址,输出eee
cout << *(p + 4) << endl; //*行地址=列地址,输出hhh
cout << endl;
//*行地址=列地址:p+1是行地址,*(p + 1)就是列地址,*(p + 1)+n就是往移动n下得到的列地址
//*列地址=取出地址里的值:列地址为*(p + 1)+n,加个*变成取地址里的值 *(*(p + 1) + 3)
cout << *(*(p + 1)) << endl;//;//第1行第0个的值输出b
cout << *(*(p + 1) + 1) << endl;;//第1行第1个的值,输出b
cout << *(*(p + 1) + 2) << endl;//第1行第2个的值,输出b
cout << *(*(p + 1) + 3) << endl;//第1行第3个的值,输出空字符
cout << *(*(p +2) + 1) << endl;//第2行第2个的值,输出n
cout << *(*(p + 2) + 2) << endl;//第2行第2个的值,输出g
cout << endl;
cout <<" 指针数组当作二维数组" << endl;
cout << tmp_p[0][0] << endl;//输出a
cout << tmp_p[0][1] << endl;//输出a
cout << tmp_p[0][2] << endl;//输出a
cout << tmp_p[1][2] << endl;//输出b,第1行第2个的值
cout << tmp_p[2][2] << endl;//输出g,第2行第2个的值
cout << endl;
cout << " 数组指针kp,,看作行指针,指向行地址,指向二维数组tmp" << endl;
cout << *(kp+1) << endl;//输出DEF,放的是列地址,所有输出本行中,从该列地址开始后面的剩余的字符串
cout << *(kp+1) + 1 << endl;//输出EF
cout << *(kp +1)+ 2 << endl;//输出F
cout << *(kp + 2) + 1 << endl;//输出HI
cout << *(kp + 2) + 2 << endl;//输出I
cout << " 在前面的基础上加*,取出列地址所值的那个地址的字符" << endl;
cout <<* (*(kp + 1)) << endl;//输出D
cout << *(*(kp + 1) + 1 )<< endl;//输出E
cout << *(*(kp + 1) + 2 )<< endl;//输出F
cout << *(*(kp + 2) + 1) << endl;//输出H
cout << *(*(kp + 2) + 2) << endl;//输出I
cout << endl;
// const char tmp[][4] = { "ABC","DEF","GHI","JKL","MNO" };
// tmp[][4] ,tmp[n]=kp[n]看作该行第0个地址开始的列地址*(kp+n)+0
cout << " 数组指针kp,当作二维数组名tmp使用" << endl;
cout << kp << endl; //004FFB6C行地址,当作地址变量输出,没什么用
cout << *kp << endl; //输出ABC,*行地址,从0个开始,即输出一行,
cout << *kp + 1 << endl; //输出BC ,*kp为列地址,*kp + 1地址移动1位
cout << kp[0] << endl; //*(kp+0),是列地址,ABC
cout << kp[1] << endl; //*(kp+1),是列地址,DEF
cout << kp[2] << endl; //*(kp+2),是列地址,GHI
cout << kp[1] + 1 << endl; //输出EF,第1行第1个地址开始的列地址
cout << kp[2] + 2 << endl; //输出I,第2行第2个地址开始的列地址,只有I
cout << endl;
return 0;
}
运行结果:
iambang
0053F884
0053F884
0053F888
0053F888
aaa
aaa
bbb
bbb
aaa
bbb
aaa
aaa
bbb
nng
eee
hhh
b
b
b
n
g
指针数组当作二维数组
a
a
a
b
g
数组指针kp,,看作行指针,指向行地址,指向二维数组tmp
DEF
EF
F
HI
I
在前面的基础上加*,取出列地址所值的那个地址的字符
D
E
F
H
I
数组指针kp,当作二维数组名tmp使用
0053F85C
ABC
BC
ABC
DEF
GHI
EF
I
请按任意键继续. . .
/*
const char *cp = “iambang”;//cp看作列地址,第0个地址开始的列地址
const char *tmp_p[] = { “aaa”,“bbb”,“nng”,“eee”,“hhh” };//指针 数组
const char **p = tmp_p;//temp_p看作行地址,p指向的是的行地址
const char tmp[][4] = { “ABC”,“DEF”,“GHI”,“JKL”,“MNO” };
const char(kp)[4] = tmp;//数组指针,指向数组的指针,用行地址初始化
tmp[n]=kp[n]看作该行第0个地址开始的列地址(kp+n)+0
总结:
数组指针指向的是行地址
行地址:二维数组名tmp,二维数组指针p,指针数组名tmp_p,数组指针kp,看作是行地址
列地址:字符指针cp,*tmp, (kp+1),(p + 2)
值: tmp_p[0][2], ((p + 1) + 3)
口诀:
&列地址 = 行地址
* 行地址 = 列地址
* 列地址 = 取地址的值
* (p3 + 1) = p3[1] = a[1]
cout <<行地址<< endl;//当作地址变量输出地址
cout << tmp_p << endl; // 输出00DAFBFC,行地址
cout << tmp_p + 1 << endl; // 输出00DAFC00,行地址
cout <<该行谋列地址<< endl;//才输出从该行这个列地址开始的剩余字符
cout << *(kp+1) << endl;//输出DEF,放的是列地址,所有输出本行中,从该第0个列地址开始后面的剩余的字符串
cout << *(kp+1) + 1 << endl;//输出EF,从该第1个列地址开始后面的剩余的字符串
cout << *(kp +1)+ 2 << endl;//输出F, 从该第2个列地址开始后面的剩余的字符串
//p指向的是的行地址
cout << *p << endl; // *行地址=列地址,输出aaa
cout << *(p + 0) +0<< endl;// *行地址=列地址,输出aaa,从该第0个列地址开始后面的剩余的字符串
cout << *(p + 1) +0<< endl;//*行地址=列地址,输出bbb,
cout << *(p + 2)+0 << endl; //*行地址=列地址,输出nng
cout <<值<< endl;//当作该地址存的值
cout << ((p + 1)) << endl;//;//第1行第0个的值输出b
cout << ((p + 1) + 1) << endl;;//第1行第1个的值,输出b
cout << ((p + 1) + 2) << endl;//第1行第2个的值,输出b
*/