数组的访问方式
·指针以固定增量在数组中移动时,效率高于下标形式
·指针增量为1且硬件具有硬件增量模型时,效率更高
·下标形式与指针形式的转换
简单例子:
#include "stdio.h"
int main()
{
int a[5] = {0};
*(a + 2) = 3;
*(a + 3) = 4;
printf("a[2] = %d\n",*(a + 2));
printf("a[3] = %d\n",*(a + 3));
return 0 ;
}
输出结果
3
4
例子29-1:
#include "stdio.h"
int main()
{
int a[5] = {0};
int* p = a;
int i = 0;
for(i = 0; i < 5 ; i ++)
{
p[i] = i + 1;
}
for(i = 0;i < 5 ;i ++)
{
printf("a[%d] = %d\n",i,*(a + i));
}
printf("\n");
for(i = 0;i < 5 ;i ++)
{
i[a] = i + 10; // ==>a[i] = i + 10
}
for(i = 0;i < 5 ;i ++)
{
printf("p[%d] = %d\n",i,p[i]);
}
return 0 ;
}
输出结果:
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
p[0] = 10
p[1] = 11
p[2] = 12
p[3] = 13
p[4] = 14
a和&a的区别
·a为数组首元素的地址
·&a为整个数组的地址
·a和&a的区别在于指针的运算
分析:a+1 增加的步长只是一个元素的大小
&a+1 增加的步长是整个数组的大小
例子29-3:
#include "stdio.h"
int main()
{
int a[5] = {1,2,3,4,5};
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
int* p3 = (int*)(a + 1);
printf("%d,%d,%d\n",p1[-1],p2[0],p3[1]);
return 0;
}
输出结果:
5,33554432,3
分析:&a + 1 指向5后面一个元素,若p1[-1]为指向该数组的上一个元素
数组参数:
·数组作为参数时,编译器将其编译成对应的指针。
void(int a[]) ←→void f(int* a);
void(int a[5]) ←→void f(int* a);
结论:
一般情况下,当定义的函数中有数组参数时,需要定义另来标识数组的大小
例子29-4:
`#include "stdio.h"
void func1(char a[5])
{
printf("In fun1:sizeof(a) = %d\n",sizeof(a));
* a = 'a';
a = NULL;
}
void func2(char b[])
{
printf("In fun2:sizeof(b) = %d\n",sizeof(b));
* b = 'b';
b = NULL;
}
int main()
{
char array[10] = {0};
func1(array);
printf("array[0} = %c\n",array[0]);
func2(array);
printf("array[0} = %c\n",array[0]);
}
输出结果:
In fun1:sizeof(a) = 4
array[0} = a
In fun2:sizeof(b) = 4
array[0} = b
数组名是不可以被赋值的
数组作为参数是假的,是不存在的,其实是指针。
小结:
·数组名和指针仅使用方式相同
-数组名的本质不是指针
-指针的本质不是数组
·数组名并不是数组的地址,而是数组首元素的地址
·函数的数组参数退化为指针
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。