关于指针的学习

今天C++学的指针,之前C语言课上讲过指针,但是当时几乎就没怎么深讲。今天讲的内容甚是让人头晕啊,回来后我在自己机器上把书上的示例程序修改了一下,仔细来看看指针。下面的就是我的指针学习程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//      Copyright 2011 ETY001 <[email protected]>
// Website:akawa.ink
#include <iostream>
using namespace std;
int main()
{
static char t[2][3][5]={"abcd","efgh","ijkl","mnop","qrst","uvwx"};
cout<<" t[i] "<<" &t[i] "<<endl;
cout<<"01::"<<t[0]<<" "<<&t[0]<<" <---t[0]"<<endl;
cout<<"02::"<<t[1]<<" "<<&t[1]<<" <---t[1]"<<endl;
cout<<"03::"<<t[0][0]<<" "<<&t[0][0]<<" <---t[0][0]"<<endl;
cout<<"04::"<<t[0][1]<<" "<<&t[0][1]<<" <---t[0][1]"<<endl;
cout<<"05::"<<t[0][2]<<" "<<&t[0][2]<<" <---t[0][2]"<<endl;
cout<<"06::"<<t[1][0]<<" "<<&t[1][0]<<" <---t[1][0]"<<endl;
cout<<"07::"<<t[1][1]<<" "<<&t[1][1]<<" <---t[1][1]"<<endl;
cout<<"08::"<<t[1][2]<<" "<<&t[1][2]<<" <---t[1][2]"<<endl;
cout<<"09::"<<t[0][0][0]<<" "<<&t[0][0][0]<<" <---t[0][0][0]"<<endl;
cout<<"10::"<<t[0][0][1]<<" "<<&t[0][0][1]<<" <---t[0][0][1]"<<endl;

cout<<"11::"<<t[0][1][0]<<" "<<&t[0][1][0]<<" <---t[0][1][0]"<<endl;
cout<<"12::"<<t[0][1][1]<<" "<<&t[0][1][1]<<" <---t[0][1][1]"<<endl;

cout<<"13::"<<t[0][2][0]<<" "<<&t[0][2][0]<<" <---t[0][2][0]"<<endl;
cout<<"14::"<<t[0][2][1]<<" "<<&t[0][2][1]<<" <---t[0][2][1]"<<endl;

cout<<"-----------------------------------"<<endl;
cout<<"1::"<<t<<" <--- t"<<endl;
cout<<"2::"<<t+1<<" <--- t+1"<<endl;
cout<<"3::"<<*t<<" <--- *t"<<endl;
cout<<"4::"<<*t+1<<" <--- *t+1"<<endl;
cout<<"5:"<<*(t+1)<<" <--- *(t+1)"<<endl;
cout<<"6:"<<*(*t+1)<<" <--- *(*t+1)"<<endl;
cout<<"7:"<<**t<<" <--- **t"<<endl;
cout<<"8:"<<***t<<" <---***t"<<endl;
cout<<"9:"<<**(t+1)<<" <---**(t+1)"<<endl;
return 0;
}

通过这个程序,对照着来看指针,就会看的比较明白。下面是程序的运行截图:

截图

从程序的运行结果中,我总结了以下几点:

1、直接输入数组名称的时候,数组名代表的是数组的入口第一个空间的地址,t和t[0],t[0][0]的地址都是一样的;
2、*t+1和&t[0][1]等价,*(t+1)和&t[1][0]等价;
3、对*t进行加1操作的时候,有时候是对t,也就是地址加一,结果是t对应的地址加上一个数据类型长度,而有时候则是对于*t所代表的值,也就是t地址所指向内存里的值进行加一(我不知道我这个理解对不对,希望高人指点,我在这里感觉有点晕)。

暂时就总结这么多,另外,补充一点,在编译过程中曾经出现错误提示,说cout没有定义,从网上搜索了一下,了解到以下情况:

<iostream>和<iostream.h>格式不一样  前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
解决方案一就是在头部加上
1
using namespace std;

,就像上面我的程序那样;
方案二就是把每个cout改为std::cout。

想知道更多,请看百度百科的namespace词条。