指针中的*和&

关注
指针中的*和&www.shan-machinery.com

一、int ***a=&&b 是什么

* 的作用有:

①声明指针   

int * p;  //声明了一个指向int类的指针p;

②对指针解除引用    

 *p=8;  //p保存的是一个地址,*解除引用,表达意思是p表示的地址的地方.

&的作用有:

①声明引用    

int &b=a; //声明了一个引用,相当于给a起了个别名叫b;

②取地址.      

b=&a;  //将a的地址给b;

形象的理解吧,除了定义声明能看出是指针和引用,其他时候          &相当于给变量加了层锁,*就相当于给变量解一层锁.

至于"锁"是什么呢

  比如&b   --->  有一层锁 --->  指的是b的地址,

        &&b ---->  加了两层锁----->指储存b的地址的地址

          *b   -----> 解一层锁  ----->   取b的内容为地址的值.

int   *p;//定义了一个指针

p=&b;//这个值赋给p

c=*p;  //这个值给c

标题的int ***a=&&b;

  首先拆分成  int ***a;     和    **a=&&b;

 第一句就是定义一个int类型的三重指针.

第二句就是 将〖记录【b的地址】的地址〗给予a,a把这个值当做地址去寻找到一个数,再把这个数当做地址寻找到目标.

简单来说,标题可以简化为int *a=b;  (= =

二、指针是内存地址的变量

unsigned long int longVar=50;

unsigned short int * pVar=&longVar ;        

地址运算符&:&longVar 这表明取longVar的地址.           

 //这里指新建一个short int类型烦人指针pVar,并且把longVar的地址赋给pVar 

/*相当于下面两句话的合体版;

unsigned short int *pVar; 

      pVar=&longVar;                    */                            

  每个单元1个字节=8位;      unsigned long int longVar=4字节=32位;       

pVar指向第一个字节,就是取其地址;

如果是unsigned short int *pVar;    *pVar=&longVar;的话 

相当于把pVar指向的地址的内容修改为102(pVar一开始不是等于0的而是随机一个内存.

比如一开始pVar指向了某个内存地址,然后就这内存地址里面的数是345346

                      ;然后就会把345346这个单元的内容变为102

指针占用的内存空间大小

 

与指针指向的内容和内容的大小无关。

在不同的操作系统及编译环境中,指针类型占用的字节数是不同的。一般而言,

编译生成16位的代码时,指针占2个字节|||||

编译生成32位的代码时,指针占4个字节|||||||

编译生成64位的代码时,指针占8个字节

 32位系统指针占4位,64位系统指针就是占8位了!

对于某一个具体的环境,可以用下面的语句精确的知道指针类型占用的字节数:

printf("%d\n", sizeof(int *));

另外,int型占用4字节(无论32位系统还是64位系统)。

例题:①int a[2][3]占_____,    2×3×4=2,int类型占4位,这里声明一个二维int类数组.4位

     ②int *a[2][3]占________,2×3×4=24位,一个指针占4位,这里声明了一个二维指针数组,就是有6个指针

     ③int (*a)[2][3]占____________,      4位,这里声明一个指向二维数组的指针

     ④在64位系统中, int *a[2][3]占___位

2×3×8=48位

三、点解要用指针!

1.管理自由存储区中的数据

最好背下来,面试经常有的

内存分为这五块

指针可以分配自由存储区!

unsigned short int* pPointer=new unsigned short int;//分配空间内存给指针.delete pPointer ; //删除指针,释放空间

内存泄露(指针申请的空间没被释放,指针就指向其他地方了,原本的空间还存在,但被遗忘了)

unsigned short int* pPointer=new unsigned short int;//分配空间内存给指针.*pPointer=9;//delete pPointer ; 应该要有这句!pPointrt=new unsigned short int; //原本那块已经赋了值得将不能使用*pPointer=84; 迷途指针 与 重踏指针

迷途指针是指:某个指针已经被delete后仍然再拿出来用~

重踏指针则通常是迷途指针的后果,是因为迷途指针被删除后,然后新指针值直接放进刚被删除的地方,然后迷途指针又被调用了,这时就会造成覆盖

unsigned short *pint=new unsigned short;*pint=10;delete pint;long *long =9000;*pint=20;//pint已经被删除了,叫做迷途指针了...然后还被拿来用,恶化为重踏指针 结果输出结果是pint=20,plong=65556;因为原本有10的地方被删了,90000就附上去了.然后,再用迷途指针给他20的时候,就会直接覆盖上去在前两个字节.(5F 90 00 01)被00 14覆盖变成 00 14 00 01 转换为 00 01 00 14就是65556

2.访问类成员和函数

3.按引用传递参数(利用指针返回多个值

   首先理解一个,函数是局部的.就是函数在自己这里发生结束完后就释放了,所以要用引用,分为指针引用和引用引用!

   例子:  int x=5,y=10;

        void swap(int x,int y);  {...}   //交换两个数的函数

        swap(x,y);                 

     结果x还是5,y还是10..因为啊,swap里面的x,y并非main的x和y..可以的话我把它改为swap(int a,int b)也行啊,这样你就理解,交换了的是ab的值,不是外边的xy值

    要swap函数达到交换功能的效果的话,可以用引用哒

—————————————————————————————

指针引用   

下面是一个加减法不用第三者就能交换值的函数

void swap(int *a,int *b){a+=b;b=a-b;a-=b;}

然后 调用时应该是这样写的

{ int x,y;//.... swap(&x,&y);}

也就是说int *a=&x,  int *b=&y;

   按照上面说的就是int *a;  a=&x; 的组合

这样对a,b两个指针操作的时候也能对x,y进行修改了.

_______________________________________________________________________________________

引用引用

下面是一个按异或,不用第三者,也不怕溢出就能交换值的函数

swap(int &a,int &b){ a^=b; b^=a; a^=b;} 然后 main里面就是这样用的swap(x,y); 

也就是说int &a=x,  int &b=y;

这样对a,b两个指针操作的时候也能对x,y进行修改了.

___________________________________________________________________________

双重指针

____________________________________________________________________________________

指针函数

 就是返回值是地址.

例如:  

int *miao(int *a,int n) {return a+n; } 假如a的地址是50,n=5;那么这里的miao的地址是55; 当然,在任何时候 你都不能给一个指针的地址赋给一个常数. 比如int *a; a=50;这样是不能编译通过的,虽然从你的想法"我试图给让a指向50那个内存",但是不允许的. 你需要靠一个中间变量 所以,指针函数中,return 的必须是一个地址,可以是指针,可以是数组名.等等  并且,也只能用指针去承接这个结果.都说了,*miao()返回的是一个地址,不是指向的一个数..所以基本是int 类型的指针函数. int *miao(){ int *b=new int;*b=36;return b;}int main(){couthttps://www.shan-machinery.com