数组指针和指针数组

1)数组指针

先明确数组的概念,

int a[10];

int *c;

其中“数组名的值是一个指针常量,也就是数组第一个元素的地址,它的类型取决于数组常量的类型…”--《C和指针》,“表达式&a[0]也是指向数组第一个元素的指针,所以c=a和c=&a[0]所执行的任务是完全一样的”但c=&a是非法的,因为&a表示的类型是指向10个元素的数组的指针。只有int (*c)[10]=&a,才正确。

a的值是一个指向整形的指针,所以a+i是数组第一个元素向后移三位,

即a[1]=*(a+1)

如果c=a+2,即c指向a[2],那么c[0]是多少呢?--再这里这种写法是完全正确的,C的下标引用和间接访问表达式是一样的,所以为什么a[1]=*(a+1),所以,c[0]=*(c+0)即为a[2];2[c]=*(2+c)=c[2];

当c[10]时即是*(c+10)指向的是a[12]这个值,超出a的范围,这种情况编译器不会报错,a[12]的值可能是你内存单元中a后面的值,这个值可能不是你希望的,这就是为什么下标检查在C中是困难的。

值得注意的是a++也是不合法的,因为a的值是个常量,在以数组名做函数参数传递的时候,传递给函数的是

一份该指针的拷贝。

多维数组

int b[3][10];

多维数组的名字b的值是指向它第一个元素的指针,类型是指向包含10个整形元素的数组的指针。(因此

int * p=b,是非法的,而int (*p)[10]=b才合法,增加p的值可以在b中逐行移动,如果要逐个移动应该如下: int *p=&b[0][0]或int *p=b[0],多维数组每个元素本身是另外一个数组

所以b+1指向b[1][0],所以*(b+1)+2指向b[1][2],即*(b+1)=b[1][0],*((b+1)+2)=b[1][2];

2)指针数组

应用: char const *keyword[5]={“do”,”while”,”for”,”int”,NULL};可以利用数组查询。

3)其他

只有有可能函数指针的形参都应该声明为const,表示指向的内容不允许改变。

const int*p ;p的内容可以修改(可以指向别的int),p指向的int值不能修改
int* const p ;p的内容不可以修改(不可以指向别的int),p指向的int值可以修改
const int* const p ;p的内容不可以修改(不可以指向别的int),p指向的int值也不可以修改

posted @ 2011-12-23 16:58  Jezze  阅读(384)  评论(0编辑  收藏  举报