指针变量
要点
1.任何指针变量占用的空间都是4个字节(32位机)
2.任何指针变量加1是使它指向下一个元素的地址
测试程序
void test_1()
{
char c;
int i;
long l;
float f;
double d;
char *pc = &c;
int *pi = &i;
long *pl = &l;
float *pf = &f;
double *pd = &d;
printf("%d\t%x\t%x\n", sizeof(pc), pc, pc + 1);
printf("%d\t%x\t%x\n", sizeof(pi), pi, pi + 1);
printf("%d\t%x\t%x\n", sizeof(pl), pl, pl + 1);
printf("%d\t%x\t%x\n", sizeof(pf), pf, pf + 1);
printf("%d\t%x\t%x\n", sizeof(pd), pd, pd + 1);
}
运行结果
指针与一维数组
要点
1. 数组名a指向的是数组首元素地址
2. &a指向的才是数组的首地址
3. a[n]内部处理就相当于*(a+n)
测试程序
void test_2()
{
char a[5]={0,1,2,3,4};
printf("%d\t%d\n",&a,&a+1);
printf("%d\t%d\n",a,a+1);
printf("%d\t%d\n",a[1],*(a+1));
}
运行结果
指针与二维数组
要点
1. 二维数组可以看成是一维数组中的每一个元素又是一个一维数组
2. 二维数组名指向的是数组首元素的地址,即行地址
3. 对行地址前加*就转换为列地址
4. 对列地址前加&就转换为行地址
5. &a才是二维数组的首地址
6. a[n][m]就相当于*(*(a+n)+m)
测试程序
void test_3()
{
char a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
printf("%d\t%d\n",&a,&a+1);
printf("%d\t%d\n",a,a+1);
printf("%d\t%d\n",*a,*a+1);
printf("%d\t%d\n",a[0],a[0]+1);
printf("%d\t%d\n",&a[0],&a[0]+1);
printf("%d\t%d\n",a[1][2],*(*(a+1)+2));
}
运行结果
《C语言程序设计》