一、指针数组vs数组指针
下面是符号认识
指针数组符号示例:int *p1[5]
数组指针符号示例:int(*p)[4]
下面分别对这两个概念讲解:
1.指针数组:
1.1符号优先级了解:*结合的优先级低于[]的优先级;
[]与()是同一优先级的;
所以p1先跟[5]个元素先结合成5个地址在跟*结合,形成所谓的指针数组;每一个元素都是整形指针,指向整形变量。
1.2使用场合剖析:利用指针数组指向每个元素的地址,而每个元素的变量名就是元素本身;
示例指针数组的元素是字符串(每个元素都是地址),取出各个元素只需要用变量名访问即可(如printf(“%d”,p1[1]))。
1.3示例代码:
#include<stdio.h>
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.数组指针:
2.1符号优先级了解:()与[]的优先级别是一样的,但是结合顺序是从左到右,所以p2先被定义为一个指针变量,指向后面紧跟着5个元素的数组;
2.2使用场合剖析见以下参考代码:
2.3参考代码:
#include<stdio.h>
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!

本文详细解析了指针数组与数组指针的区别及其应用场景。通过示例代码展示了如何定义和使用这两种类型的指针,并解释了它们在内存中的布局方式及优先级规则。
1444

被折叠的 条评论
为什么被折叠?



