一、指针的内容
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];
这里再八卦一下有个两个称呼叫:指针函数和函数指针:
指针函数:本质上就是一个函数,只不过其返回值为某个类型的指针!!!
函数指针:本质上是一个指针,指向了一个函数的实现地址,通过这个指针可以去调用它指向的函数!!!
所以谁修饰谁是很重要的。
鞭影落春堤,绿锦鄣泥卷。
脉脉逗菱丝,嫩水吴姬眼。
啮膝带香归,谁整樱桃宴。
蜡泪恼东风,旧垒眠新燕。
-- 纳兰性德 《生查子·鞭影落春堤》