c++指针学习

来源:互联网 发布:mac怎么播放rar 编辑:程序博客网 时间:2024/06/06 09:28

之前对指针与取地址符混淆不会使用,特此总结一次。


1.指针是一个变量,存储的是值的地址而不是值本身,用*表示。
而&表示为地址运算符号。
如:home为一个变量,则&home即为其地址。
指针表示的是一个地址,*运算表示为解除引用运算符。

操作环境:c++ VS2013
int updates=6;int *p_updates;//定义指针 typeName * pointerName;p_updates=&updates;//将updates地址赋给p_updates指针存储/*此时,updates=*p_updates=6;//就像是一枚硬币的正反面      &updates=p_updates=地址的值*/
int *p1,p2//创建了一个指针p1和int变量p2int higgens=5;int *pt=&higgens;//将指针直接初始化为一个地址/*此时,higgens=*pt=5;      &higgens=pt=地址的值,其实和上一个例子是一样的      在对指针用*前,一定要将指针初始化为一个确定的适合的地址。*/

2.不能将数字作为地址值简单的赋值给指针,应使用强制类型转换将数字转换为合适的地址类型。如:

int *pt;pt=(int *)0xB8000000;

3.使用new来分配内存

int *pn= new int;//模板/*new int告诉程序,需要适合存储int 的内存,然后它找到这样的内存,并返回其地址。然后将该地址赋值给pn,pn存储该地址,*pn存储那里的值。*/

4.使用delete来释放指针

int *ps =new int;.......delete ps;/*释放ps所指向的内存吗,但不会删除指针ps本身。而new与delete必须配套使用,不要尝试释放已经释放的内存块。对空指针使用delete是安全的。*/

5.使用new创建动态数组并释放

int size;cin>>size;int *psome=new int[size];//返回数组第一个元素的地址并赋值给指针psome...delete [] psome;

6.数组与指针基本等价
指针一般指向数组的第一个元素,但我们也可以进行如下索引:

double * p3=new double[3];p3[0]=0.2;//也等于*p3 c++多将数组名视作为数组第一个元素的地址。p3[1]=0.5;//等价于*(p3+1)p3[2]=0.8;p3=p3+1;//指针将指向第二个元素//区别在于可以修改指针的值,而数组的名为常量不可修改。//对数组求sizeof得到数组的长度,而对指针应用得到指针的长度。

7.当两个指针指向同一个数组时,可以用一个指针减去另一个指针得到两个元素的间隔:

int tacos[10]={1,2,3,4,5,6,7,8,9,10};int * pt=tacos;int * pe=&tacos[9];int diff=pe-pt;//diff=7

8.指针与字符串
如果只给cout提供一个字符的地址,它将从该字符开始打印,直到遇到空字符为止:

char flower[10]="rose"cout<<flower<<endl;//打印结果为"rose",而希望其结果为"r"而类似"hello world"的字符串也类似数组名,也是第一个元素的地址。在cout与多数c++表达式中,char数组名、char指针、以及引号引起的常量字符串都被解释为第一个字符的地址。char *ps;cin>>animal;//fox!ps=animal//并不会复制字符串,只是复制地址。获得副本字符串的操作:ps=new char[strlen(animal)+1];//strlen()来确定字符串长度,+1则表示获得包含空字符时的该字符串的长度。然后再用new来分配内存空间。strcpy(ps,animal);//将字符串拷贝到新的存储空间。//strcpy函数参数第一个为目标地址,第二个为要复制字符串的地址。strncpy函数还有第三个参数为要复制的最大字符数。strcpy,strncpy基于C风格的<cstring>库而c++<string>库可以使用赋值运算符号进行上述运算而不用担心跨界了

9.使用new创建动态结构

/*如果结构标识符是结构名,则用句点运算符;如果结构标识符是指向结构的指针,则用箭头运算符。*/struct things{ int good; int bad;}things grubnose = {3,453};things *pt = &grubnose;//grubnose.good=pt->good=3//grubnose.bad=pt->bad=453