指针
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 *这种类型的指针 ,只是表示可以转化成别的类型.