网站后台管理教程,下载软件的app大全,网站数据库做好了 怎么做网页,企业网站建设网文章目录1 数组的访问方式1.1 数组的访问方式代码分析2 数组和指针不同3 a 和 a 的区别3.1 指针运算的经典代码案例分析4 数组作为函数的参数4.1 数组作为函数参数的代码案例分析5 总结开题问#xff1a;数组名可以当做常量指针使用。那么指针是否可以当做数组来使用?
… 文章目录1 数组的访问方式1.1 数组的访问方式代码分析2 数组和指针不同3 a 和 a 的区别3.1 指针运算的经典代码案例分析4 数组作为函数的参数4.1 数组作为函数参数的代码案例分析5 总结 开题问数组名可以当做常量指针使用。那么指针是否可以当做数组来使用?
1 数组的访问方式
以下标的形式访问数组中的元素 以指针的形式访问数组中的元素 下标形式与指针形式的转换 对于上面的转换方式不要觉得奇怪。这是很正确的转换。 1.1 数组的访问方式代码分析
数组下标形式的访问我们很常见下面看一看不是很常见的访问形式;
代码 29-1.c
#include stdio.hint main(){int a[5] {0};int* p a;int i 0;for(i0; i5; i){p[i] i1;}for(i0; i5; i){printf(a[%d] %d\n, i,*(ai));}printf(\n);for(i0; i5; i){i[a] i10;}for(i0; i5; i){printf(a[%d] %d\n,i, p[i]);}return 0;
}编译运行结果为 可以看出
指针确实可以当做数组来使用访问数组可以通过下标形式与指针形式具体见上图中的转换公式。
2 数组和指针不同
虽然上面说了数组与指针都可以进行访问数组它们很相似但是数组与指针是不同的。在之前的文章中已经有过分析这里不再赘述直接看以前的文章【软件开发底层知识修炼】二十七 C/C中的指针与数组是不同的
3 a 和 a 的区别
a为数组首元素的地址a 为整个数组的地址a 和 a 虽然在数值上是相等的。但是它们的意义不同。在指针运算中存在差别 3.1 指针运算的经典代码案例分析
代码29-3.c
#include stdio.hint 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
我们暂且不看p2[0]的结果。
p1[-1] 表示当前指针指向的元素的前一的元素。因为 a 1 后是直接跨过可整个数组到了数组最后一个元素的下一个元素的位置。所以 p[-1] 5p3[1] 3很好理解。*(p3 1) 3
那么p2[0]到底是怎么回事
可以看下图的数组的内存图Linux 系统下的小端模型 上图就是数组a的内存模型在Linux系统的小端模式下。如果这个不懂那就没法往后看。a是数组首元素的地址a1 是第二个元素的地址这也很好理解(int)a 是将a这个常量指针转换为int型变量加入为tmp那么(int)a 1 就直接相当于这个tmp变量加1然后就到了如上图中的位置。然后(int*)((int)a 1) 又将其转换为指针。所以*p2 p2[0] 0x020000000x02000000转换为十进制的值是33554432 。到这里就应该没有什么疑问了
4 数组作为函数的参数
数组作为函数的参数的时候编译器会将其编译为对应的指针。 注意所以数组作为函数参数的时候必须将数组的个数也作为参数传进去否则在函数内无法计算数组的大小。 4.1 数组作为函数参数的代码案例分析
代码29-4.c
#include stdio.hvoid func1(char a[5]){printf(In func1 sizeof(a)%d\n,sizeof(a));*a a;a NULL; //可以作为左值但是数组就不行
}void func2(char b[]){printf(In func2 sizeof(b)%d\n,sizeof(b));*b b;b NULL; //可以作为左值但是数组就不行
}
int main(){char array[10] {0};func1(array);printf(In func1 array[0]%c\n, array[0]);func2(array);printf(In func2 array[0]%c\n, array[0]);return 0;
}编译运行结果如下 分析
由上述代码看出当数组作为函数参数时在函数体内它的大小永远是4是因为它在编译的过程中退化为指针。在32系统中指针的大小总是4字节。并且可以看出数组作为函数参数的时候可以作为左值。但是数组就不可以作为左值这也充分说明数组作为函数参数的时候最终退化为指针指针是可以作为左值的。
5 总结
数组名和指针仅仅是使用方式相同。数组与指针的本质是不同的。数组名不是整个数组的地址它是数组首元素的地址数组作为函数参数的时候会被编译器编译为指针。