形如int a[10]的整数数组,a[3]表示的是一个int类型的数值,那么a的类型是什么呢?
对于一个数组来说,数组名是整个数组的首地址,同时也是数组第一个元素a[0]的地址,它是一个指针常量,它的类型取决于数组的类型,如果数组是int型,那么它就是一个指向int型的常量指针,如果数组是char,那么是指向char型的常量指针,注意这是指针常量,不是指针变量,常量的值是不能改变的,不能被赋值。
数组名+整数(如a+3):a是一个指向XX类型的指针,这个3根据数组的类型的长度值来调整,+3的结果是指向另一xx类型的指针,表明它指向的元素是从数组的第一个元素向后面移动3个xx类型长度的位置,也就是指向a[3],等价于&a[3]
但是,指针和数组名不是一回事
int a[10];
int *b;
a和b都可以进行间接访问,以及下标引用操作,但是他们区别很大。
声明一个数组时,编译器会根据声明所指定的元素数量以及类型,为数组保留内存空间。然后再创建数组名,数组名的值是一个常量:指向这段内存空间的首地址
声明一个指针变量时候,编译器为指针变量本身保存内存空间,并不为任何整型变量保留内存空间,区别如下
指针变量如果没有初始化,它指向的地址是随机的,也就是图中?的意思。所以*b是会访问内存中一个不确定的地址。而*a是访问数组第一个元素
同时,a是一个指针常量,b是一个指针变量,可以b++,不可以a++