C++,指针数组,数组指针,二维数组指针,字符指针

// 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
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值