下面是符号认识
指针数组符号示例:int *p1[5]
数组指针符号示例:int(*p)[4]
下面分别对这两个概念讲解:
1.1符号优先级了解:*结合的优先级低于[]的优先级;
[]与()是同一优先级的;
所以p1先跟[5]个元素先结合成5个地址在跟*结合,形成所谓的指针数组;每一个元素都是整形指针,指向整形变量。
1.2使用场合剖析:利用指针数组指向每个元素的地址,而每个元素的变量名就是元素本身;
示例指针数组的元素是字符串(每个元素都是地址),取出各个元素只需要用变量名访问即可(如printf(“%d”,p1[1]))。
1.3示例代码:
#include
int main()
{
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int *p1[5]={&a,&b,&c,&d,&e};/*我们知指针就是地址由此可见这是一个由5个指向整型数指针(地址)组成的数组;*/
for(int i=0;i<5;i++){
printf("%d ",*p1[i]);
}
putchar('\n');
printf("=======================\n");
char *p3[5]={
"111111",
"222222",
"333333",
"444444",
"555555"};
for(int i = 0;i<5;i++){
printf("%s\n",p3[i] );//p3[i]是地址
}
return 0;
}
2.1符号优先级了解:()与[]的优先级别是一样的,但是结合顺序是从左到右,所以p2先被定义为一个指针变量,指向后面紧跟着5个元素的数组;
2.2使用场合剖析见以下参考代码:
2.3参考代码:
#include
int main()
{
int temp[5]={1,2,3,4,5};
int(*p)[5]=&temp;/*数组实际是一组由多个地址并排的地址组合,数组指针实际是指向数组头的指针,用在二维数组里面也是一样的,看起来有点不一样而已,换方不换药;*/
/*数组指针指的是数组,而数组名又可以当成是第一个元素来用;在数组名前面加一个取地址符号(不加也可,加上便于理解)*/
/*指针就是地址,这个指针取的是数组的地址,但二维数组中可以不用加;数组名在二维数组里面表示的
是数组,数组名又代表是地址*/
for(int i =0;i<5;i++){
printf("%d ",*(*p+i));
}
putchar('\n');
int temp1[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p2)[4];
p2=temp1;
int i,j;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d ",*(*(p2+i)+j));
}
}
return 0;
}
附件:(了解一下即可)
优先级 |
运算符 |
含义 |
使用形式 |
结合性 |
说明 |
1 |
[ ] |
数组下标 |
数组名[整型表达式] |
左到右 → |
|
( ) |
圆括号 |
(表达式) |
|||
. |
成员选择(对象) |
对象.成员名 |
|||
-> |
成员选择(指针) |
对象指针->成员名 |
|||
++ |
自增运算符 |
变量名++ |
单目运算符 |
||
-- |
自减运算符 |
变量名-- |
单目运算符 |
||
2 |
- |
负号运算符 |
-表达式 |
右到左 ← |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 |
单目运算符 |
||
++ |
自增运算符 |
++变量名 |
单目运算符 |
||
-- |
自减运算符 |
--变量名 |
单目运算符 |
||
* |
取值运算符 |
*指针表达式 |
单目运算符 |
||
& |
取地址运算符 |
&左值表达式 |
单目运算符 |
||
! |
逻辑非运算符 |
!表达式 |
单目运算符 |
||
~ |
按位取反运算符 |
~表达式 |
单目运算符 |
||
sizeof |
长度运算符 |
sizeof 表达式 或 sizeof(类型) |
单目运算符 |
||
3 |
/ |
除 |
表达式 / 表达式 |
左到右 → |
双目运算符 |
* |
乘 |
表达式 * 表达式 |
双目运算符 |
||
% |
余数(取模) |
整型表达式 % 整型表达式 |
双目运算符 |
||
4 |
+ |
加 |
表达式 + 表达式 |
左到右 → |
双目运算符 |
- |
减 |
表达式 - 表达式 |
双目运算符 |
||
5 |
<< |
左移 |
表达式 << 表达式 |
左到右 → |
双目运算符 |
>> |
右移 |
表达式 >> 表达式 |
双目运算符 |
||
6 |
> |
大于 |
表达式 > 表达式 |
左到右 → |
双目运算符 |
>= |
大于等于 |
表达式 >= 表达式 |
双目运算符 |
||
< |
小于 |
表达式 < 表达式 |
双目运算符 |
||
<= |
小于等于 |
表达式 <= 表达式 |
双目运算符 |
||
7 |
== |
等于 |
表达式 == 表达式 |
左到右 → |
双目运算符 |
!= |
不等于 |
表达式 != 表达式 |
双目运算符 |
||
8 |
& |
按位与 |
整型表达式 & 整型表达式 |
左到右 → |
双目运算符 |
9 |
^ |
按位异或 |
整型表达式 ^ 整型表达式 |
左到右 → |
双目运算符 |
10 |
| |
按位或 |
整型表达式 | 整型表达式 |
左到右 → |
双目运算符 |
11 |
&& |
逻辑与 |
表达式 && 表达式 |
左到右 → |
双目运算符 |
12 |
|| |
逻辑或 |
表达式 || 表达式 |
左到右 → |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 ← |
三目运算符 |
14 |
= |
赋值运算符 |
变量 = 表达式 |
右到左 |
双目运算符 |
/= |
除后赋值 |
变量 /= 表达式 |
双目运算符 |
||
*= |
乘后赋值 |
变量 *= 表达式 |
双目运算符 |
||
%= |
取模后赋值 |
变量 %= 表达式 |
双目运算符 |
||
+= |
加后赋值 |
变量 += 表达式 |
双目运算符 |
||
-= |
减后赋值 |
变量 -= 表达式 |
双目运算符 |
||
<<= |
左移后赋值 |
变量 <<= 表达式 |
双目运算符 |
||
>>= |
右移后赋值 |
变量 >>= 表达式 |
双目运算符 |
||
&= |
按位与后赋值 |
变量 &= 表达式 |
双目运算符 |
||
^= |
按位异或后赋值 |
变量 ^= 表达式 |
双目运算符 |
||
|= |
按位或后赋值 |
变量 |= 表达式 |
双目运算符 |
||
15 |
, |
逗号运算符 |
表达式1,表达式2,表达式3,… |
左到右 → |
转自B站小甲鱼总结:运算符的优先级和结合性,《带你学C带你飞》【第一季】,C\C++交流,鱼C论坛 - Powered by Discuz!