C语言基础
- 指针与一维数组
- 总结
- * p++、* (p++)、(\*p)++、* ++p、*(++p)、++*p区别和用法
- 运算优先级
- ++p与p++区别
- *p++与 *(p++)与(*p)++
- *++p与 *(++p)与 ++*p
- 指针常量与一维数组的关系
- 指针变量与一维数组的关系
- 数组在子函数中弱化为指针
- 指针常量与二维数组的关系
- 数组指针
- 定义
- 数组指针与一维数组的关系
- 数组指针与二维数组的关系
- 指针数组
- 定义
- 指针数组与二维数组关系
指针与一维数组
指针+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)
指针常量与二维数组的关系
总结:
- a,&a,a[0],&a[0],&a[0] [0],值都是相同的(都是首地址),但其意义不同
a(指针常量——整个二维数组名) 数据类型是 int(*)[3] 此时a这个指针常量指向一维数组a[0]
a[0] (指针常量——整个一维数组名) 数据类型int * 此时a[0]这个指针常量指向a[0] [0]- 为什么a不是int**类型?
a[0]是int *类型,指向是一个int类型,如果是二级指针,a+1移动4/8字节,实质上发现移动12字节,
此时证明a不是二级指针- a指向a[0],a[0]指向a[0] [0]
数组指针
本质:指针
概念:指向数组的指针
定义
<存储类型> 数据类型 指针名;
int (*p)[3];
- p先跟*结合,表示p的本质是一个指针
- 数据类型:p所指向的数组里面的元素的数据类型
数组指针p的数据类型:int () [3]
数组指针p指向的数据类型:int [3]
tip: []的优先级高于的优先级
p先和*结合,*代表指针,此时这就是一个数组指针
p先和[]结合,[]代表数组,此时这就是一个指针数组
数组名p
- 数组首元素地址 int * (地址常量)
- 整个数组 int [3] (变量)
数组指针与一维数组的关系
数组指针对其+1,直接移动一整个一维数组,指向数组底部,容易产生数组越界问题,因此一般不使用数组指针操作一维数组。
数组指针与二维数组的关系
指针数组
本质:数组
概念:由指针组合起来的数组,数组中的元素都是指针类型
定义
<存储类型> 数据类型 数组名[元素个数];
int* a[3];
//a先跟[]结合,表示a的本质是一个数组
//数据类型:a数组中的元素的数据类型
指针数组a的数据类型:int* [3]
指针数组保存的数据类型:int*
指针数组与二维数组关系