一、指针的内容

1、提到指针,一定要考虑到内存!

2、不论指针指向的数据类型是什么,声明了一个指针,该指针就占4个字节(byte),无论是32bit还是64bit;

3、在指针和数组面前,*是指针表示,取值;&是取地址;

4、声明一个指针p,那么p是指针,存放着指向所指内容的地址;&p得到指针自己的内存地址;*p得到指针所指向的数值;

5、以下两种表达式的意义不同:

第一句是在声明指针的时候对其所指向对地址赋值,相当于p=NULL;后面三句是在声明指针之后,对其所指向的内容进行赋值,即*p=NULL,p!=NULL

6、直接对地址赋值:

在VC6.0中每次编译变量的地址都是一样的,但是在visual studio中却不一样,所以这样的做法在VS中未必适用。并且这里要注意必须进行强制类型转换

二、数组

数组跟指针...应该算是一对基友吧。举个栗子,按照义下代码来理解:

int a[5] = { 1, 1, 1, 1, 1 };
cout << "a:" << a << endl;
cout << "a+1:" << a + 1 << endl;
cout << "a-1:" << a - 1 << endl;
cout << "&a:" << &a << endl;
cout << "&a+1:" << &a + 1 << endl;
cout << "&a-1:" << &a - 1 << endl;

1、a是数组名,同时在内存方面,a表示数组第一个元素的首地址,这里需要与&a区别开来,&a表示数组的首地址,两者的意义不同,但是数值上一般是相同的,但是与也有不同的情况出现,这里会涉及到大端小端的概念。

a)、a与&a的数值是一样的,都是000000A7B855F6E8,指向了同一个内存地址,但是要区分开来,两者意义不同;

b)、&a+1表示数组a的下一个数据的地址,因为a是一个包含5个int型元素的数组,所以&a+1为&a+sizeof(int)*5,64bit下,int是4字节,所以加20,也就是加14(这里是16进制表示);

c)、同样,&a-1表示a的上一个数据,并且,编译器在这里将其大小与a一样,所以&a-1 = &a-sizeof(int)*5;

e)、a是数组第一个元素的首地址,所以a+1是数组的第二个元素首地址,与a相差4byte;

f)、a-1则表示数组的上一个“数组的最后一个元素的首”地址,当然,这个“数组”可能不存在或者未必是数组,所以以本数组a为参考,取一个in型为差值,所以相差4byte。

2、a不能作为左值,但是a[i]可以。

三、数组还是指针?

1、都能以指针形式或者数组下标形式访问数据:

char *pChar = "zcx";    
char ch[] = "zcx";
cout << "*(pChar + 2)=" << *(pChar + 2) << endl;
cout << "pChar[2]=" << pChar[2] << endl;
cout << "*(ch + 2)=" << *(ch + 2) << endl;
cout << "ch[2]=" << ch[2] << endl;

2、声明为数组,定义为指针;或者声明为指针,定义为数组 ---- 都是错的:

char *pChar2 = NULL;
pChar2 = {'z'};
char ch2[3];
ch2 = "zc";

四、数组指针、指针数组(不是绕口令)

1、指针数组,也就是一个数组,每个元素为一个指针:

int *p1[10];
//或者应该写成 int* p1[10];

2、数组指针,也就是一个指针,指向一个数组的指针:

int (*p2)[10];

这里再八卦一下有个两个称呼叫:指针函数和函数指针:

指针函数:本质上就是一个函数,只不过其返回值为某个类型的指针!!!

函数指针:本质上是一个指针,指向了一个函数的实现地址,通过这个指针可以去调用它指向的函数!!!

所以谁修饰谁是很重要的。

鞭影落春堤,绿锦鄣泥卷。

脉脉逗菱丝,嫩水吴姬眼。

啮膝带香归,谁整樱桃宴。

蜡泪恼东风,旧垒眠新燕。

  -- 纳兰性德 《生查子·鞭影落春堤》