例10.12用指针变量输出数组元素的值。
main()
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
  intp;
  for(p=a[0];p<a[0]+12;p++)
  {if((p-a[0])%4==0)printf("\n");
   printf("%4D",*p);

   }
运行结果如下:
1 3 5 7
9 11 13 15
17 19 21 23
p是一个指向整型变量的指针变量,它可以指向一般的整型变量,也可以指向整型的数组元素。每次使p值加1,以移向下一元素。if语句的作用是使一行输出4个数据,然后换行。如果读者对p的值还缺乏具体概念的话,可以把p的值(即数组元素的地址)输出。
可将程序最后两个语句改为
printf("addr=%o,value=%4d\n",p,*p);这时输出如下:
addr=236,value=1
addr=240,value=3
addr=242,value=5
addr=244,value=7
addr=246,value=9
addr=250,value=11
addr=252,value=13
addr=254,value=15
addr=256,value=17
addr=260,value=19
addr=262,value=21
addr=264,value=23
注意地址是以八进制数表示的(输出格式符为%o)。
上例是顺序输出数组中各元素之值,比较简单。如果要输出某个指定的数组元素(例如a[1][2]),则应事先计算该元素在数组中的相对位置(即相对于数组起始位置的相对位移量)。计算a[i][j]在数组中的相对位置的计算公式为i*m+j其中m为二维数组的列数(二维数组大小为n×m)。例如,对上述3×4的二维数组,它的第2行第3列元素(a[2][3])对a[0][0]的相对位置为2*4+3=11。如果开始时使指针变量p指向a(即(a[0][0]),为了得到a[2][3]的值,可以用*(p+2*4+3)表示。(p+11)是a[2][3]的地址。a[i][j]的地址为a[0]+i*m+j。下面来说明上述(a[0]+i*m+j)中的i*m+j公式的含义。从图10.27可以看到在a[i][j]元素之前有i行元素(每行有m个元素),在a[i][j]所在行,a[i][j]的前面还有j个元素,因此a[i][j]之前共有i×m+j个元素。例如,a[2][3]的前面有两行(共2×4=8个)元素,在它本行内还有3个元素在它前面,故共有8+3=11个元素在它之前。可用p+11表示其相对位置。