关于指向指针的指针

[复制链接]
查看11 | 回复3 | 2011-5-5 11:51:04 | 显示全部楼层 |阅读模式
#include
using namespace std;
int main()
{ char **p;
char *name[]={"BASIC","FORTRAN","C++","PASCAL","COBOL"};
p=name+2;
cout<<*p<<endl;
cout<<*p[2]<<endl;
return 0;
}
例如这个程序,当我用*p[0]代替*p[2]时显示的值一样都为**p=C,请问这是为什么,有*p[2]这种写法吗?
原来p[2]不等于p+2,知道了,呵呵,现在为什么p[2]指向COBOL呢?

回复

使用道具 举报

千问 | 2011-5-5 11:51:04 | 显示全部楼层
首先 回答 第一个问题当我用*p[0]代替*p[2]时显示的值一样答 : 首先 你声明的name 是一个指针数组 也就是说 这个数组里面的每一个元素 都是一个指针 他们保存的都是一个地址 这个地址 分别指向{"BASIC","FORTRAN","C++","PASCAL","COBOL"}用" "声明的字符串 都存储在常量区 每一个指针 都指向 常量区中的 每一个字符串的首地址所以 p=name+2; 的意思是 p里面存储着 “C++”的首地址所以*p[0]的意思的给 "C++"的首地址 解引用 所以 就是C 了*p[2]的意思是 p指向的是"C++"后面的第二个指针指向的地址 就是name[4]存储的地址 也就是"COBO
回复

使用道具 举报

千问 | 2011-5-5 11:51:04 | 显示全部楼层
*p指向"C++",cout << *p <<endl;输出"C++“,你应该理解对吗?p[2]即等于"p = p + 2; "然后取"*p"。所以p[2]指向"COBOL"。"*p[2]"是p[2]所指向字符串第一个字符,即为"C"。"*p[0]"是"C++"的第一个字符,刚好也是"C"。"*p[1]"则为"PASCAL"的第一个字符,为"P"。"*p
回复

使用道具 举报

千问 | 2011-5-5 11:51:04 | 显示全部楼层
p是二级指针。*p是字符指针相当于p[0]。*p[0]和*p[2]:[]优先级大于*所以p[0]先结合,相当于(p+0)是一个字符指针;再于*结合,就是取第一个字符*p[0]的“C”是“C++”的C,*p[2]的“C”是“COBOL”的“C”。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行