-指针

指针:一个保存地址的变量,没什么特殊的。(指针的值是为了找到变量的位置,指针的类型是为了对变量进行特定的操作),指针是比喻的说法,a指向b实际上是a保存b的起始地址。

1.1.1 无类型指针

定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为void类型指针。

void *p

1.1.2 NULL

NULL在C/C++标准库中被定义为一个宏,一般为: 

#define NULL ((void*)0)     空指针指向0地址

1.1.3 空指针与野指针

指向NULL的指针叫空指针,没有具体指向任何变量地址的指针叫野指针


函数放在代码区,函数名就是地址. 定义:返回类型 ( *p ) (参数类型)=函数名,调用:p(实参)。  int add(int a,int b)    int (*p)(int,int)=add;

在回调函数和运行期动态绑定的时候大量的用到了指向函数的指针。

回调函数举例,因为该函数不知道该调用哪个函数,所以只能把函数当做参数来传递。有了函数指针的概念就可以把函数作为一个参数来传给另一个函数

typedef  int(*p)(intint)   // 函数指针类型 p     (  typedef  类型 变量名      变量名就成了该类型的别名)

void func(int(*p)(intint), int aint b)

{

int res = p(ab);

printf("%d\n", res);

}


定义长度不确定的数组:int * array = (int*)malloc(sizeof(int)*n)
二维数组作参数需要指明int[][n]列数
引用传递为了不修改原始值可以用const修饰保护参数 

int a[100]; 
int * p1=&a[1];       int   * p2=&a[3];   p2-p1=(3-1)*4/4=8 
char * p1=&a[1];         char * p2=&a[3];   p2-p1=(3-1)*4/1=8
short * p1=&a[1];       short * p2=&a[3];   p2-p1=(3-1)*4/2=8

用指针可以修改const常量,这是c的漏洞,c++不允许 
int (*p)[3] //定义一个指向int[3]这种类型的指针(当然在二维数组中的元素都是这种数组类型) 
p++ 跨了3*4=12个字节
p+i代表a中第i+1个数组的地址,即&a[i]。//还不能定位哪个一维数组,p与二维同级 
*(p+i)代表a中第i+1个元素的值,即a[i]第i+1个数组名。 //通过数组地址找到数组,*p与一维数组同级
*(*(p+i)+j) //通过列号找到数组中的元素,**p与int同级
p==*p但是意义是不一样的
  数组的地址=数组第一个元素的地址
     数组名=数组第一个元素的地址 
a[i][j]=*(*(p+i)+j) 

int buf[3][5]

二维数组名称,buf代表数组首地址

int (*a)[5]

定义一个指向int [5]类型的指针变量a

a[0], *(a + 0), *a

0行,0列元素地址

a + 1

1行首地址

a[1], *(a + 1)

1行,0列元素地址

a[1] + 2, *(a + 1) + 2, &a[1][2]

1行,2列元素地址

*(a[1] + 2), *(*(a + 1) + 2), a[1][2]

1行,2列元素的值


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值