指针与数组的关系
数组名被看做数组的第一个元素在内存中的首地址,(sizeof操作中表示所占内存的大小),数组名在表达式中自动转换为一个指向数组第一个元素的指针常量。
#define N 5
int main()
{
int ar[N] = {12,23,34,45,56};
int size = sizeof(ar);//20
printf("%p \n",ar);
printf("%p \n",&ar[0]);
}
ar是数组第一个元素的地址,ar是数组第一个元素ar[0],ar+1,是第二个元素的地址,(ar+1)是ar[1],指针加一,地址移动一个数组元素所占的字节数。
arr[i] =>*(arr+i)。
指针访问
int main()
{
#define N 5
int main()
{
int ar[N] = {12,23,34,45,56};
int *p = ar;
for(int i = 0;i < N;i++)
{
printf("%p => %d %d \n",p+i,*(p+i));
}
}
}
指针、数组、函数的关系
#define N 5
void Print_Array(int br[5],int n)
{
int len = sizeof(br);
int len1 = sizeof(br[0]);
printf("%d %d\n",len,len1);
}
int main()
{
int ar[N] = {12,23,34,45,56};
int n = sizeof(ar);
printf("%d\n",n);
Print_Ar(ar,n);
}
假设数组作为函数的形参,调用过程如下,耗损空间时间,因此数组作为函数的形参,数组将退化为指针类型。
三种声明方式,每种方式都会退化成指针。
void Print_Array(int br[5],int n);
void Print_Array(int br[],int n);
void Print_Array(int *br,int n);
总结:数组也是有类型的,数组名表示一组类型相同的数据,在定义数组时,或者和sizeof、&运算符一起使用时数组名才表示整个数组,否则表达式中的数组名会被转换为一个指向数组首元素的指针。