但在使用数组(在语句或表达式中引用)时,数组总是可以写成指针的形式,两者可以互换。对情况进行了总结如下图一。
图一
切记:当作为函数定义的形式参数时,数组下标表达式总是可以改写为带偏移量的指针表达式。char my_array[10]; char *my_ptr; i=strlen(my_arry); j=strlen(my_ptr);我们还可以看到很多类似的程序:
printf("%s %s",my_array,my_ptr);它清楚的展示了数组和指针的互换性。但是它的前提条件是它们作为函数的参数时。
printf(" %x %s",my_array,my_ptr);在同一条语句中,即把数组名作为地址,又可以将其作为一个指针。它之所以可以这样互换,因为printf是一个函数。
int main(int argc,char **argv){} //或者: int main(int argc,char *argv[]){}
啰嗦这么多就是想说明一个问题:那就是只有在作为函数参数时,指针和数组才能互换。而不是我们心里想的,指针和数组就是一样的!
二、C语言的多维数组
多维数组本来在我的C基础里有详细的讲解,但是为了熟悉巩固,我又复习一遍,并且画出了一张图,来说明多维数组与指针的用法。
C语言中的数组就是一维数组,当提到C语言的数组时,就把它看作是一种向量(vector),也就是某种对象的一维数组,数组的元素可以是另一个数组。
如何分解多维数组,以及多维数组和指针的关系,如下代码,详解如下图二所示:
代码示例:
#include <iostream> using namespace std; int main() { int array[2][2][2]={1,2,3,4,5,6,7,8}; int (*p)[2][2][2]=&array; int (*p1)[2][2]=array; cout<<sizeof(array)<<endl; cout<<sizeof(&array)<<endl; cout<<array<<endl; cout<<&array<<endl; cout<<array+1<<endl; cout<<&array+1<<endl; cout<<array[0][0][0]<<" "<<&array[0][0][0]<<endl; cout<<array[0][0][1]<<" "<<&array[0][0][1]<<endl; cout<<array[0][1][0]<<" "<<&array[0][1][0]<<endl; cout<<array[0][1][1]<<" "<<&array[0][1][1]<<endl; cout<<array[1][0][0]<<" "<<&array[1][0][0]<<endl; cout<<array[1][0][1]<<" "<<&array[1][0][1]<<endl; cout<<array[1][1][0]<<" "<<&array[1][1][0]<<endl; cout<<array[1][1][1]<<" "<<&array[1][1][1]<<endl; system("pause"); return 0; }运行结果:
具体分析如下图所示:
但是Fortran里则是“列行主序”,如果将C语言的矩阵传递给
所以一个Fortran程序,矩阵就会被自动转置,这是一个非常厉害的邪门秘技。
如下实例:
int function(int a,float b){} //其中a,b都是形参;实参:在实际调用中传给函数的具体的值;
function(12,3.14);//12和3.14就是实参在函数形参定义这个特殊的情况下,编译器必须把数组形式改写成指向数组第一个元素的指针形式,编译器执行函数传递数组的地址,而不是整个数组的值。
function(int *array){} function(int array[100]){} function(int array[]){}四、为什么C语言把数组形参当作指针?
图三
注意有一样操作只能在指针里完成而无法再数组中进行,那就是修改它的值。数组名是不可修改的左值,它的值是不能改变的。如下实例所示:
#include<stdio.h> int main(void) { double d0=0.0; int i0[2]={0,0}; printf("sizeof double is:%d\n",sizeof(double)); printf("sizeof int is:%d\n",sizeof( int )); if(*(double*)i0==d0){ printf("%lf\n",*(double *)i0); printf("%lf\n",d0); puts("is the same!"); } else { puts("not the same!"); } system("pause"); return 0; }代码设计参考网上的资料与知识,若有不对,欢迎指正。
运行的结果: