指针中的*和& | 您所在的位置:网站首页 › 指针在scanf中的考察 › 指针中的*和& |
一、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() { cout |
CopyRight 2018-2019 实验室设备网 版权所有 |