指针

来源:互联网 发布:hecras软件 编辑:程序博客网 时间:2024/06/06 01:40

指针就是指向变量的地址:

int *p    (*是指声明的意思—声明一个P指针)及如果没有指向的东西,称为野指针。

如何杜绝野指针:

int*p=&a;   int*p=null   把NULL赋值给P;

悬空指针:是指针最初指向的内存已经被释放了的一种指针。

如果两个指针(p1和p2)指向同一块内存区域, 那么free(p1)后,p1和p2都成为悬空指针。如果进一步将p1设置为NULL, 那么p2还是悬空指针。诚然,使用*p1会导致非法内存访问,但是使用*p2却会出现无法预料的结果,可谓防不胜防。例如:

1 #include <stdlib.h>2 int main(int argc, char *argv[])3 {4         int *p1 = (int *)malloc(sizeof (int));5         int *p2 = p1;        /* p2 and p1 are pointing to the same memory */6         free(p1);            /* p1 is       a dangling pointer, so is p2  */7         p1 = NULL;           /* p1 is not   a dangling pointer any more   */8         return (*p2 & 0x7f); /* p2 is still a dangling pointer            */9 }

指针的分类:

*p              一级指针

**a            二级指针

***b          三级指针

.

.

.

一级指针指向变量的地址,二级直指向一级指针的地址,三级指针指向二级指针的地址.................

(*    &  和变量的结合顺序为从右向左 )

void main

{

  int a=10,b=20;

int*p=&a;

int**s=&p;

}



 &p 0x0012ff10                                              &s  0x0012ff04

p=>0x0012ff28                                              s=>0x0012ff10

*p=>a                                                          *s=>0x0012ff28=>p

&*p=>&a                                                    **s=>*p=>a

*&p=>&a


&**s=>&*p=>&a         <=>   **&s=>*&p=>&a

指针的大小

在VS中不管是几级指针的大小都为四字节(因为指针是用来存放变量首地址的)

派生类指针和基本类型是不能转化的:

1. 类型决定指针+1的能力和决定内存的内容的理解角度不同表达的内容就不同。

                                          


如果将int a=0x22225;

char*p=&a;

(如果这样赋值的话,堆内存大人内容解释成了随意值。是不允许的)

如果要转也是要强转

char*p=(char*)a;