通过数组下标所能完成的任何操作都可以通过指针来实现。一般来说,用指针编写的程序比用数组下标编写的程序执行速度快。
为了叙述方便,现声明整型数组和指针:
1、数组名和指针都表示地址
2、都可以通过a[i]和pa[i]或者*(a+i)和*(pa+i)访问第i个元素
不同点:
1、指针是变量,数组名是常量指针。(所以pa = a 和 pa++操作都是合法的,而a = pa 和 a++ 操作是不合法的 编译报错:lvalue required as increment operand)
2、声明数组时,会分配一些内存空间,用于容纳数组元素;声明指针时,只分配了用于容纳指针本身的内存空间。(sizeof(a) = 4*10; sizeof(pa) = 4)
数组和指针的联系:
C语言标准对此做了如下说明:
规则1:表达式中的数组名被编译器当做指向该数组的第一个元素的指针
规则2:下标总是与指针和偏移量相同
为了叙述方便,现声明整型数组和指针:
int a[10], *pa;
相同点:
1、数组名和指针都表示地址
2、都可以通过a[i]和pa[i]或者*(a+i)和*(pa+i)访问第i个元素
不同点:
1、指针是变量,数组名是常量指针。(所以pa = a 和 pa++操作都是合法的,而a = pa 和 a++ 操作是不合法的 编译报错:lvalue required as increment operand)
2、声明数组时,会分配一些内存空间,用于容纳数组元素;声明指针时,只分配了用于容纳指针本身的内存空间。(sizeof(a) = 4*10; sizeof(pa) = 4)
数组和指针的联系:
C语言标准对此做了如下说明:
规则1:表达式中的数组名被编译器当做指向该数组的第一个元素的指针
规则2:下标总是与指针和偏移量相同
规则3:在函数参数的声明中(形式参数),数组名被编译器当做指向该数组第一个元素的指针
补充:c语言不进行下标检查,c在处理下标操作符时把a[i]看做*(a + i),所以 a [ i ] 和 i [ a ]都是合法的。编译器把 i [ a ]看做 *(i + a)。