指针

指针

1.指针是 什么 ?

指针 是变量 ,里面放的是地址 ;

如果 定义了一个指针变量,先使用而又不给地址 ,会出现"段错误";

指针变量的过程:① 先定义指针变量。②给指针变量一个地址。③再使用指针变量,如果不给地址就会段错误。

2. 指针的定义

指向一个整型数的指针: int  *a;

一个指向指针的指针,这个指针指向的是整型数: int  **a;

一个有10个整型数的数组:int a[10];

一个有10个指针的数组,该指针指向一个整型数 :  int*a[10]

 一个指向函数的指针,  该函数有一个整型参数,并返回一个整型数   : int (*p)(int a)

一个有10个指针的数组, 该指针指向一个函数,该函数有一个整型参数,并返回一个整型数 ,       int (*a[10])(int a)

3. 主要符号

主要的符号

int  b;  定义整型变量

int*a;  定义指向整型的指针变量;

&b:  取b的地址;

a = &b;  把b的地址给a,a中就放的是b的地址

*a=10;   指针变量a所指向的单元,赋值为10;

4.*px++, ++*px用法;

int  x=3,y=0;

int *px = &x;

y =++*px=====〉y=++(*px);  把*px指向的内容+1,给y;y=4;

y=*px++ =====> y=(*px)++;即 y=*px; px++;

注意:y=3;

  px中的地址加一个单元;不一定是一个字节,看单元内容类别:

例如:

int x=3;

int *px=&x;

这个时候px的内容是x的地址:如bfa25884;

再经过 px++后,

 px内容变为: bfa25888,加了int一个单元的大小,即4个字节;

5.指针和数组

int a[5];

int *ptr;

ptr = a;----数组a的首地址给ptr;

也可以写成:

ptr=&a[0];-----第一个元素的地址给ptr;

6.指针和字符串

char *ptr;

ptr="hello world";

或者:

char *ptr = "hello world";

 

后面碰到:char * ----,就要想到字符串;“”

7. 函数指针

int fun(int);

int (*p)(int)

p = fun;   ---把fun函数的入口地址给指针p;

8. 表示方法

int a[10];

int *p=a;

p+i, a+i都表示a[i]的元素地址;

*(p+i), *(a+i)都是表示a[i];

**********************************************

p[i] 和*(p+i) 等价

**********************************************  

a[5]----*(a+5), *(p+5),p[5] 等价的;

&a[5]---p+5, a+5,等价都是a[5]的地址;

 

下标法:a[i],p[i];

指针法 :*(a+i), *(p+i)

9.指针数组,数组指针

char *str = "hello world"-----表示的str中放置的是hello  world的首地址;

如果几个字符串放在一个数组中,如:

char  *str[4] = {"hello", "world", "yes","what"};  ----指针数组,表示:

      str[0]中放置的是“hello" 的首地址;

      str[1]中放置的是"world"的首地址;

      str[2]中放置的是 “yes”的首地址;

      str[3]中放置的是"what"的首地址;

 数组指针:

int a[4][4]={{0,1,2,3},

                  {4,5,6,7},

                  {8,9,10,11},

                   {12,13,14,15}};

 

int  (*p)[4]------数组指针;

p=a;  -----p放置的是a的第0行首地址;

p------0,1,2,3

p+1-----4,5,6,7

p+2-----8,9,10,11

p+3-----12,13,14,15

10.int **p

 int *p ----p放地址----〉3

 int  **p----*p----p-----3

11.野指针 

a野指针出现的现象 :

① 定义了以后 ,没有给地址赋值 ;

②地址释放了以后 ,指针没有指NULL;

b避免野指针 :

①定义的时候 =NULL;使用前赋值;

②释放的时候 ;free(p);

                     p=NULL;

③assert(NULL !=p)------函数的入口处 ;

在函数的入口处使用assert(NULL != p)对参数进行校验。或者用if(NULL != p)来校验。它会提醒我们有没有初始化指针,起到定位错误的功能。

assert是个宏,它后面括号里的条件若不满足,则程序终止运行并提示出错。

 

使用完指针后务必记得释放指针所指向的内存,否则不知道什么时候我们又改变了指针的值,使其变成了野指针!

这里就需要free(p)这个函数的帮忙了,它可以切断指针与指向内存的联系。但是需要注意的是free对于同一指针变量只能使用一次。不然会导致出错或者内存泄漏。

释放完内存后另指针的值变为NULL!

free(p);

p = NULL;

12.void *

void sum(void): void 表示 返回值是空,参数是空的 ; 

void * malloc(100);

 char *ptr;

ptr  = (char *)malloc(100);

 

void *: 表示可以转化成 int *, char * ,float *等 ;没有void *这种类型的指针 ,只是表示可以转化成别的类型.

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值