主要内容:二维数组和指针,&*a[i][0]的理解、数组1[e]和e[1]
#include <stdio.h>
#define NUM_ROWS 10
#define NUM_COLS 10
int main(int argc, char **argv)
{
int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int **
int c, d=2,*test, e[2] = {4,5},f[2][2] = {{11,22},{33,44}}; // e理解为int *
test = &d;
// c = *&test; //和&(*test)结果一样,*和&同一优先级,按右到左
c = &*test; // 注意和++*test的差别,这里有点不懂,为什&(*test)不出错,我
// 感觉是*test等效于d,而不是具体的数值,然后&(*test)相当于&(d)
// 所以才印证下面在指针操作时&和*可取消
// c = ++*test;
printf("1[e] = %d\n",1[e]); // 1[e] 和 e[1] 一样,因为对编译器而言e[1] 等价于*(e + 1)==>*(1 + e)
// 则等价于1[e] ,但良好编程习惯不要这样写
printf(" c = %d\n",c);
printf(" d的地址为 = %d\n",&d);
// test = &*e[0]; // 这句出错(*&e[0]编译通过但是运行出错),指针才可以&和*取消,e[0]是常数,
//下面f[1] 表示第二行
// printf(" 常数d = %d\n",*test);
test = &*f[1];
printf(" d = %d\n",*test);
for(i = 0; i < NUM_ROWS; i++)
{
/* 使p指向二维数组的某一行用p = &a[i][0] 等价于p = a[i]
* C语言中二维数组按行存储
* 数组下标与指针算术运算间的神奇公式
* 对任意数组a, a[i]等价于*(a+1) .
* 因为&和*可以取消,则&a[i][0]等价于&(*(a[i]+0)) ==>等价于&*a[i] ==>a[i]
*/
for(p = a[i]; p < a[i] + NUM_COLS; p++)
{
*p = i;
printf("%3d ",*p);
}
printf("\n");
}
return 0;
}
输出: