指针

  • 指针即变量的地址 & 指针变量
  • 指针变量i,则*i为i指向的变量
  • 定义 int,char…… *p,赋值 p=&a
  • *:取指针指向变量;&:取变量地址。二者优先级相同,自右向左
  • 不能写:int *temp;*temp=*a,只能写temp=*a,因为temp指向的值是不可预见的,有可能破坏正常系统工作

 

1.指针与数组

  • int *p ; p=&a[0]等价于int *p ; p=a,数组名即第一个位置的指针,因此在前章,数组传给形参若改变会改变原值,因为传递的是数组名即地址
  • *(p+i)=a[i]
  • p++是合理的,在数组的打印中,执行效率比a[i] , *(a+i)要高;而a是一个指针常量,不能a++
  • ++与*优先级相同,*p++等价于*(p++),即先*p,再使p+1
  • 形参数组:f(int array[])等价于f(int *array)
  • 函数中可直接*(array+1)即形参数组名是指针变量,实参数组名是指针常量
  • 函数形参可不指定数组长度就因为形参数组名是一个指针变量,不用开辟储存空间

 

  • 注意数组找中间元素的地址,是p=p+(n-1)/2而不能直接等于(n-1)/2

 

  • 不能只定义*array就当数组用

 

  • 多维数组,如二维,a为第0行的首地址,a[0]=*a=*(a+0)即为第0行0列元素的地址,a[i]=a+i , a[i][j]=*(a[i]+j)=*(*(a+i)+j),即a是指向行的指针,加*后成为指向列的指针。指向行的指针和指向列的指针指向对象长度不同。
  • p=&a[0][0](而不是p=a),则a[i][j]=*(p+i*y+j)(一共x行y列)
  • 定义:int (*p)[4]表示指针变量p,指向包含4个整形元素的一位数组,p相当于a,不能写成int *p[4],指针数组

 

2.字符串指针

  • 字符串可以定义char *string=“xxxxx”,相当于char *string;string=“”而不是*string=“”printf后用string即可,打印时系统自动不断+1,其中string是地址常量
  • 可以直接用string[i]
  • 注意不能直接char string=“”
  • 定义:char *a=str(str为数组名)

 

3.函数的指针

  • int (*p)(int, int)中p是指向一个函数的指针,而int *p(int, int)是一个函数,返回值为指向整型的指针,所以要加括号。赋值之后,如int max(int, int);p=max;p即为函数的入口地址,但p+1无意义。
  • 调用:c=(*p)(a, b)
  • 意义:作为实参传给a函数的形参,在a函数便可调用。若每次调用a函数要获得不同处理,但处理流程相同,只是需要不同函数,便可使用函数指针作为形参,以便每次调用所需函数,而a函数不需修改。
  • 比如,给abc三数,第一次输出最大值,第二次输出最小值,第三次输出累和,便可用一个函数,分别调用不同函数来处理

 

  • 返回指针值的函数,可以用于查找某特殊数据,找到所需数据的位置以便主函数使用

 

4.指针数组

  • int *p[n]
  • 二维数组可用指针数组实现,数组中的指针分别指向一位数组的第一位的地址,便实现了列数可变的“二维数组”,减少内存的消耗

排序时调整指向即可,也不需整排修改,快速实现排序

 

5.指针的指针

  • int **p,其中*p是指向的指针

 

6.其他

  • 初始化:p=NULL
  • 两指针变量可相减,相加无意义
  • void指针,引用时需强制转换:(char * )p/max()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值