C 错题本
C 错题集
数组和指针 (二)
- 数组下标 ‘’[]” 内可以是表达式 但下标值不可超过初始定义范围
a[1>2][!1] “1>2”为假,等于0 “!1” :1为真 ,非1 就是假,故为0 所以前式是求a[0] [0]

- 这里先解释
int *q[]这里表示的是把整个数组定义为指针
即可这样定义
1.指针指向变量
1 | // 定义指针数组,包含3个整型指针 |
2.指针指向数组
1 | // 也可以指向数组 |

这里主要想讲解D选项:
1 | //a是二维数组,把首地址a[i]重新看成一个指针常量,即: |
再插入一个知识点 指向指针的数组和指针数组的区别
int(*)[10]-指向指针的数组
1 | int(*ptr)[10]; |
- 含义:一个指针,指向包含10个整数的数组
- 类型:指向数组的指针
- 内存大小:
sizeof(ptr)是指针的大小(通常4或8字节) - 指针运算:
ptr + 1跳过整个数组(10 * sizeof(int) 字节)
示例:
1 | int arr[10] = {0}; |
int[10] - 指针数组*
1 | int* arr[10]; |
- **含义:**一个包含10个整型指针的数组
- **类型:**指针数组
- **内存大小:*sizeof(arr) = 10 * sizeof(int)(通常40或80字节)
相当于有十个内存条,每个内存条放一个整型指针,若此时“arr+1”那则是跳过第一个内存条到下一个内存条中,则一次跳过4个字节
- **指针运算:**arr + 1 跳过一个指针的大小(通常4或8字节)
示例:
1 | int a = 1, b = 2, c = 3; |

定义并初始化数组
1 | int a[3][2] = {1,2,3,4,5,6}, *p[3]; |
数组 a 按行填充(换成一维数组来思考):
- a[0]: {1, 2}
- a[1]: {3, 4}
- a[2]: {5, 6}
p 是指针数组,每个元素是 int* 类型
1 | p[0] = a[1]; |
所以p[0]指向 (为指针)a[1] [0]
1 | *(p[0] + 1) |
p[0] 指向 a [1] [0](地址)
p[0] + 1 指向下一个 int,即 a[1] [1](值为 4)
解引用得到 a[1] [1] 的值 4
所以 ***(p[0] + 1)** 代表数组元素 a[1][1]。

1 | int c[4][5]; //二维数组 |
注意题目是说要正确引用数组c的元素 不是地址or指针
1 | A.p+1 //p=&c[0] p+1=&c[1](是指向第二行的指针,类型是int(*)[5],并不是数组元素,而是指向一行的指针。) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 My blog!