1)数组名就是一个指向数组首地址的指针常量。对于指针数组符号’[]’相当于指针符号’*’,所以数组元素的地址有下面几种表示:
&a[0].......&a[i] a................a+i pa.............pa+i
从技术上可以说数组就相当于指针,但是在声明一个数组,C语言编译时会分配一段固定的连续空间,而声明一个指针却不会。
2)实际上C语言只有一维数组。多维数组其实可以理解为指针数组和普通数组的结合。
例如,char a[2][5];可以理解为一个char *a[2]数组,里面的每个元素分别指向一个char b[5]数组。
在二维数组x中,数组名x表示数组的首地址,x[i]表示一个一维数组的名称,(也就是说x[i]不保存元素值),它只是一个地址。x和x[i]的值相等,但是*a!=*a[0],因为a是一个二维数组首地址指针,a[0]一个一维数组首地址指针,引用它们指向的变量时会根据自己类型性质定义变量的类型性质。如下代码:
void main()
{
char a[2][6]={"Hello","World"}; char * p; p = a;
if(a==a[0])
printf("a==a[0]\n"); if(*a==*a[0])
printf("*a==*a[0]\n"); if(*p==*a[0])
printf("*p==*a[0]\n"); printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a[0])); getch(); }
运算结果: a==a[0] *p==*a[0] 12 6
x[i]表示数组的首地址,x[i][j]表示数组x[i]的第j+1个元素的值,&x[i][j]返回数组x[i]的第j+1个元素的地址。也可以使用*(x[i]+j)的方式表示第j+1个元素的值,而*(x[i]+j)又可表示为*(*(x+i)+j)。
3)指针的运算:赋值、间接运算、求地址、递增、递减、求差、比较。指针加上后减去一个整数偏移的长度等于这个整数乘以指针所指数据类型的长度。如下面的代码:
int main()
{
unsigned int i;
unsigned int *p = &i; printf("%d %d",p,p+1); getch(); }
运行输出: -58 -56 |
|