#include<stdio.h>
int main()
{
const int n = 5;
int ar[n] = { 12,23,34,45,56 };
for (int i = 0; i < n; i++)
{
printf("%d %d\n", ar[i], *(ar + i));
//从逻辑上有两种访问形式,下标访问:ar[i] 和指针访问:*(ar+i)。
//从物理上讲,只有一种访问形式,就是指针访问形式。
}
return 0;
}
编译器会把下标访问全部转换为指针访问。
当然也可以采用下面这种访问形式。
#include<stdio.h>
int main()
{
const int n = 5;
int ar[n] = { 12,23,34,45,56 };
int* p = ar;
for (int i = 0; i < n; i++)
{
printf("%d %d %d\n", p[i],i[p], *(p + i));
}
return 0;
}
对于下面的Print_Ar函数,会打印出什么样的结果呢?
#include<stdio.h>
void Print_Ar(int br[10])
{
int size = sizeof(br);
printf("size:%d \n", size);
}
int main()
{
const int n = 10;
int ar[n] = { 12,23,34,45,56,67,78,89,90,100};
Print_Ar(ar);
return 0;
}
输出:size:4
为什么会这样呢?是因为在编译的过程中,编译器会把作为形参的数组名退化成指针。如下:
void Print_Ar(int *br)
{
int size = sizeof(br);
printf("size:%d \n", size);
}
int main()
{
const int n = 10;
int ar[n] = { 12,23,34,45,56,67,78,89,90,100};
Print_Ar(ar);
return 0;
}
为什么要退化为指针呢?原因是可以节省内存空间。【任何问题,都会有原因的。】