一、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;//<加了一层锁的b >这个值赋给p
c=*p; //<解了一层锁的p,其中p是加了一层锁的b,于是就是b了反正>这个值给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已经被删除了,叫做迷途指针了...然后还被拿来用,恶化为重踏指针
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;
}
int *miao()
{
int *b=new int;
*b=36;
return b;
}
int main()
{
cout<<*miao();
return 0;
}
再看这个函数,大概你就知道怎么用指针函数了.
最后输出的就是36.函数中返回的就是b的地址,就是 int *miao=b;
就是说miao()=b; 然后在主程序中*miao()=*b=36;
顺带一句,如果指针是怎么写:int *b; *b=36;的话很有可能就出错.
因为没有申请到内存.
________________________________________________________________________________
纠错:答案为黑色
#include<stdio.h>
#include<string.h>
char *get()
{
char p[]="hello world";
printf("%s",p);
return p;
}
void main()
{
char *str=NULL;
str=get();
printf("%s",str);
}
把p[ ]字符串改成指针 char *p;
C和C++标准对char型数组的首地址输出做了个特殊规定,直接输出首地址的话,会输出数组内容。
这里的return p并不是首地址了
int *a()
{
int b[3]={5,8,9};
return b;
}
还有,类似这种也是不可取的.因为b[ ]这样做会覆盖掉其他函数里面的这个值
应该为他申请新的内存或者改为全局变量
编译器一般也会提醒:returning address of local variable or temporary
Linking...
832

被折叠的 条评论
为什么被折叠?



