C语言基础(六)

指针与一维数组

指针+1,加到哪里?加多大?

  • 指针常量算术运算的偏移量取决于指针指向的数据类型大小
    在这里插入图片描述

总结

  • p+n:相当于指针p向地址增大方向移动n个数据(数据大小=sizeof(指向的数据类型)),p可以为指针常量或者指针变量
  • p-n:相当于指针p向地址减小方向移动n个数据(数据大小=sizeof(指向的数据类型)),p可以为指针常量或者指针变量
  • p++:指针p向地址增大方向移动1个数据(数据大小=sizeof(指向的数据类型)),p为指针变量
  • p–:指针p向地址减小方向移动1个数据(数据大小=sizeof(指向的数据类型)),p为指针变量
  • p-q:(p和q的指针类型需要匹配)两个指针之间相差的数据个数(十六进制p-q的差值)/sizeof(指向的数据类型)
    在这里插入图片描述
    注意:
    1、指针的算术运算需要操作连续的空间地址才有意义
    2、p是指针变量,可以++或者–(指针常量不可)

* p++、* (p++)、(*p)++、* ++p、*(++p)、++*p区别和用法

运算优先级

  • *与++两种运算符的优先级相同,都是从右向左结合
    在这里插入图片描述

在这里插入图片描述

++p与p++区别

++p:先自增再取值
p++:先取值再自增

*p++与 *(p++)与(*p)++

  • *p++
    1、按从右至左的运算顺序结合,p先与++结合
    2、又因p++,是先赋值后++,因此p先与*结合
    3、先取值 * p ,之后再对p++做自增操作

在这里插入图片描述

  • *(p++)
    1、先算小括号里面,p先与++结合
    2、又因p++,是先赋值后++,因此p先与*结合
    3、先取值*p,之后再对p++做自增操作
    在这里插入图片描述
  • (*p)++
    1、因括号优先级高,先算括号内,先取值*p
    2、然后再对取出的值加1
    在这里插入图片描述

*++p与 *(++p)与 ++*p

  • *++p
    1、从右至左结合,先++p,对指针p先自加,指向下一个地址
    2、再取值
    在这里插入图片描述
  • ++*p
    1、先与*结合,先取值
    2、再对所取的值进行加1
    在这里插入图片描述
  • *(++p)
    1、先小括号,对指针p,先自增
    2、再取值
    在这里插入图片描述
    eg:
    在这里插入图片描述

指针常量与一维数组的关系

在这里插入图片描述
在这里插入图片描述
不可以对指针常量++
在这里插入图片描述

指针变量与一维数组的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

printf有表达式的时候,为右结合原则
当i=0时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=1,后p加加指向arr[1];*(p+i)为arr[1]的值为2;p[i]为2;arr[0],(arr+i)正常输出;当前p指向arr[1];
当i=1时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=2,后p加加指向arr[2];*(p+i)为arr[3]的值为4;p[i]为4;arr[0],(arr+i)正常输出;当前p指向arr[3];
当i=2时,右结合原则,*(p++)先小括号,但p++是先赋值后自加,即先取值p=3,后p加加指向arr[3];*(p+i)越界;p[i]为越界;arr[0],(arr+i)正常输出;

数组在子函数中弱化为指针

void input(int *p, int m)
//可以在子函数中像main函数一样操作数组,操作的是同一片地址
void input(int a[], int m)
void input(int a[100], int m)

指针常量与二维数组的关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:

  1. a,&a,a[0],&a[0],&a[0] [0],值都是相同的(都是首地址),但其意义不同
    a(指针常量——整个二维数组名) 数据类型是 int(*)[3] 此时a这个指针常量指向一维数组a[0]
    a[0] (指针常量——整个一维数组名) 数据类型int * 此时a[0]这个指针常量指向a[0] [0]
  2. 为什么a不是int**类型?
    a[0]是int *类型,指向是一个int类型,如果是二级指针,a+1移动4/8字节,实质上发现移动12字节,
    此时证明a不是二级指针
  3. a指向a[0],a[0]指向a[0] [0]

数组指针

本质:指针
概念:指向数组的指针

定义

<存储类型> 数据类型 指针名;
int (*p)[3];

  • p先跟*结合,表示p的本质是一个指针
  • 数据类型:p所指向的数组里面的元素的数据类型

数组指针p的数据类型:int () [3]
数组指针p指向的数据类型:int [3]
tip: []的优先级高于
的优先级
p先和*结合,*代表指针,此时这就是一个数组指针
p先和[]结合,[]代表数组,此时这就是一个指针数组

数组名p

  1. 数组首元素地址 int * (地址常量)
  2. 整个数组 int [3] (变量)

数组指针与一维数组的关系

在这里插入图片描述
在这里插入图片描述
数组指针对其+1,直接移动一整个一维数组,指向数组底部,容易产生数组越界问题,因此一般不使用数组指针操作一维数组。

在这里插入图片描述

数组指针与二维数组的关系

在这里插入图片描述
在这里插入图片描述

指针数组

本质:数组
概念:由指针组合起来的数组,数组中的元素都是指针类型

定义

<存储类型> 数据类型 数组名[元素个数];
int* a[3];
//a先跟[]结合,表示a的本质是一个数组
//数据类型:a数组中的元素的数据类型

指针数组a的数据类型:int* [3]
指针数组保存的数据类型:int*

在这里插入图片描述
在这里插入图片描述

指针数组与二维数组关系

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值