指针与数组,main函数的参数
承接昨天一篇
3.指针数组
一个数组的元素值为指针则是指针数组。
指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
例如: int *pa[3];
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
表示形式 |
含义 |
地址值 |
&a |
指向二维数组的指针 |
1000 |
a |
二维数组名,指向一维数组a[0],即第0行首地址 |
1000 |
a[0] , *(a+0) , *a |
第0行第0列元素地址 |
1000 |
a+1 , &a[1] |
第1行首地址 |
1006 |
a[1] , *(a+1) |
第1行第0列元素地址 |
1006 |
a[1]+2 , *(a+1)+2 , &a[1][2] |
第1行第2列元素地址 |
1010 |
*(a[1]2) , *(*(a+1)+2) , a[1][2] |
第1行第2列元素的值 |
|
不要把&a[i]简单的理解为a[i]的物理地址,因为并不存在a[i]这个变量。它只是一种地址的计算方法,能得到第i行的地址。
&a[i]和a[i]的值是一样的,但它的含义却不同。 &a[i]或a+i指向行,而a[i]或*(a+i)指向列。当下标j=0时,&a[i]和a[i]+j的值相等。*(a+i)只是a[i]的另一种表示形式。在二维数组中,a+i=a[i]=*(a+i)=&a[i]=&a[i][0]即它们的地址值是相等的。
4.数组指针;
int a[5][10] 与 int (*p)[10];
二维数组名是一个指向有10个元素的一维数组的指针常量
p=a+i 使 p指向二维数组的第i行
*(*(p+i)+j) Û a[i][j]
二维数组形参实际上是一维数组指针变量,
即 int x[ ][10] Û int (*x)[10]
变量定义(不是形参)时两者不等价,系统只给p分配能保存一个指针值的内存区(一般2字节);而给a分配2*5*10字节的内存区
5.main函数
main函数的参数:
main (int argc,char *argv[])
argc(第一个形参)必须是整型变量,
argv( 第二个形参)必须是指向字符串的指针数组。
argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数);
argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 针数组的长度即为参数个数。