|
发表于 2022-10-11 19:03:47
|
显示全部楼层
本帖最后由 jackz007 于 2022-10-11 20:24 编辑
- p1 = & a ; // 为指针 p1 赋值为数组 a 的内存地址
- * p1 = & a ; // 为指针 p1 所指向的内存地址赋值为数组 a 的内存地址
复制代码
1、我们是要把 a 的地址赋值给指针 p1,而不是要赋值给 p1 所指向的内存地址,而且,这个时候,p1 还没有指向有效的内存地址,为 * p1 (无效地址) 赋值会直接给程序带来灾难;
2、int (*p) [4] 定义了 p 为指向末维是 4 的二维整型数组的指针,例如,可以把 p 指向 int a[5][4] ;那么,就可以像使用 a[ i ][j] 那样通过 p[ i ][j] 来访问二维数组 a 中的每一个元素。
*(* p + j) 实际上是 *(* (p + 0) + j) 也就是 p[0][j]
楼主可以考察一下这个代码和运行结果:
- #include <stdio.h>
- int main(void)
- {
- int d[4][3] = {{ 1 , 2 , 3} , \
- {11 , 12 , 13} , \
- {21 , 22 , 23} , \
- {31 , 32 , 33}} ;
- int (* p)[3] = d , i , j , k ;
- for(i = 0 ; i < 4 ; i ++) {
- printf("%2d" , p[i][0]) ;
- for(j = 1 ; j < 3 ; j ++) printf(" , %2d" , p[i][j]) ;
- printf("\n") ;
- }
- printf("\n") ;
- for(i = 0 ; i < 4 ; i ++) {
- printf("%2d" , *(* (p + i))) ;
- for(j = 1 ; j < 3 ; j ++) printf(" , %2d" , * (* (p + i) + j)) ;
- printf("\n") ;
- }
- }
复制代码
编译、运行实况:
- D:\[00.Exerciese.2022]\C>g++ -o x x.c
- D:\[00.Exerciese.2022]\C>x
- 1 , 2 , 3
- 11 , 12 , 13
- 21 , 22 , 23
- 31 , 32 , 33
- 1 , 2 , 3
- 11 , 12 , 13
- 21 , 22 , 23
- 31 , 32 , 33
- D:\[00.Exerciese.2022]\C>
复制代码 |
|