您的位置:首页 > 编程语言 > C语言/C++

【笔记-C语言】 指针

2017-12-15 19:12 211 查看

指针存储的是内存地址,而内存地址是一个数字,所以*p等价于*0xffffffff(32位系统的指针)

int a;    int *p;

a等价于*p, p为一个int型的指针, *p作为一个整体时为int型

可以使用typedef  int*  INT  则INT  p ;  p为指针

typedef int  a;  (a指代int类型)  int a;(a表示变量)

指针移动一位与指针类型相关

 

int  a=10;

char  *p=&a; 编译会出现警告

p+1移动一个字节(char)

 

在32位系统中,指针占四个字节,其中存放着指向的变量的地址值

指针包含:

自身所在的地址值

自身变量名

存储的变量的地址值

指针的类型

指向的数据的类型

 

void  *p

通用指针,不可移动或取值,可赋值给任意类型的指针。c中可直接赋值,c++中需要类型转换

 

int  *p

 一级指针p+1代表移动指针类型一块(一个单位)的大小,本质为一级指针中所存地址值发生变化。对*p操作即为对p指向的变量的操作

 

int  **pp

二级指针存着一级指针的地址,pp+1代表移动四个字节(32位系统中指针四个字节,在一级指针连续存储时+1才有意义)。因为指向的是一级指针,对*pp操作即为对pp指向的一级指针进行操作.对**p操作即为对pp指向的一级指针指向的变量进行操作

 pp类型是int **(int型指针的指针),指向int
*。

int  a = 10;

int *p = NULL;  

int **pp = &p;

*pp = &a;

 

int  *p[3]

指针数组,数组中元素为指针

 

char*  val1[100] = {0};  等价于

char**
val2 = (int**)malloc(sizeof(int*)*100);

 

 

int  (*p)[3]   

数组指针,p指向数组,p+1代表移动数组大小

 

int  *p(int)  

函数,返回值为int*,参数类型为int

 

int  (*p)(int)

函数指针,返回值int,带一个参数int

 

函数指针使用:

void fun1(int a,char b){cout<<a<<endl;}

 

void (*)(int,char) 是函数指针的类型

void (*p)(int,char)  是定义函数指针对象p

 

====方式1

void (*p)(int,char) = NULL;//定义一个函数指针p,初始化为NULL

p = fun1;//指向函数

p(2,'a');//调用

====方式2

typedef void (*pfun)(int,char); //重定义类型

pfun p = NULL;

p = fun1; 

p(2,'a');

 

 

 

const  int *p或者int const *p  常量的指针

const在*p前,*p为一个int型的值,表示p指向的值不可改变

   (不可通过p指针修改变量)

int  *const  p; 常量指针(形容指针是常量,不能改变)

const 在p前,表示p不可移动,指向的值可变(p的内存地址

值不可变)

 

void  getMemory(char *p){ p=(char*)malloc(10);}

该函数不能给p分配内存,而且会造成内存泄漏。因为编译器要为每个参数制作临时副本,p的副本_p(_p指向p),修改_p指向的内容,也就是p指向的内容被修改。但是,为_p分配内存相当于让_p的指向另一片内存,而p指向的地方不变。

在函数中改变指针的指向无效。

在函数中分配的正确方法为:
1) void  getMemoryA(char **p){*p=(char*)malloc(10);}

2) char *getMemoryB(){ return (char*)malloc(10);}
 
调用时:
char *p = NULL;
getMemoryA(&p); 或 p = getMemoryB();
 

 

野指针:指向垃圾内存,没有指向null的指针。

产生原因:1)指针变量没有被初始化为null;2)free内存后没有指向null;3)指针操作超过了变量生存周期。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言