int scanffile(FILE fp,int n){
int i;
static int array[10]; //因为array是局部变量,随scanffile()函数的结束,该内存被释放,因此,你在之后得不到相应的数据了。 改成static静态变量就可以了!
for(i=0;i<n;i++){
fscanf(fp,"%d\t",&array[i]);
}
for(i=0;i<5;i++)
printf("%d\t",array[i]);
return array;
}
不管是几维的数组,他都是按照一个个的区间存储的,你把数组设置成int类型的,那他就以int为单位进行空间分配,你说的a23会分配6个int的空间,而取行的地址则为一行的储存,如果只取一个应该写成&a00就是第0行0列的地址了
首先可以肯定的是无论几维的数组在内存中存储时都是连续的,但是数组每个元素在内存中的排列方式具体是按照什么的规则来排呢?这主要取决与编译器,一般有按行排,也有按列排,也有其他的一些排法。所以如果你想用指针表示一个数组中某一个元素的地址,关键还是要了解数组在内存中的具体排列方式。
&buf的指针类型的类型是int ()[100]
所以&buf+1即buff+100,即&buff[100],即数组最后一个元素占用内存后的地址位
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数组的首地址,是一个地址常量。但是在函数声明的形参列表中除外。
比如:
int foo(char a[10]);
在这种情况下这样的声明与
int foo(char a[]);
int foo(char a);
是等价的,就是说这种情况下,就算你写的是数组的形式,编译器实际处理的时候也当指针来处理(注意指针是变量,形参也是变量,二者刚好对应)。所以在函数foo内部,你对a进行++, --, +=,=之类的带赋值的 *** 作是完全合法的,因为此时a就是一个指针,不是数组名,当你往函数foo里面传入一个已经事先声明的数组的首地址时候,指针a里面的值就是你这个已经声明的数组的首地址,这样你在foo里面就可以对你那个数组进行 *** 作,正是因为C有这个传地址的优点,所以省略了很多不必要的拷贝工作,试想如果没有这个传地址,你传一个有几万个元素的数组进去,那拷贝工作是相当可观的。这样,你该明白了int main(int argc, char argv);里面为什么可以对argv进行++ *** 作了,既然“main函数的第二个形参是一个指向字符串的指针数组”,argv出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。楼主,请结合我前面的讲解,仔细体会我前面这句话的意思。
要看数组的类型
比如int型,以一个int型数据4个字节,内存的起始地址为1000来说
int a[5]的内存地址:
a[0] 1000
a[1] 1004
a[2] 1008
a[3] 1012
a[4] 1016
int a[2][3]的内存地址:
a[0][0] 1000
a[0][1] 1004
a[0][2] 1008
a[1][0] 1012
a[1][1] 1016
a[1][2] 1020
int a[2][2][3]
a[0][0][0] 1000
a[0][0][1] 1004
a[0][0][2] 1008
a[0][1][0] 1012
a[0][1][1] 1016
a[0][1][2] 1020
a[1][0][0] 1024
a[1][0][1] 1028
a[1][0][2] 1032
a[1][1][0] 1036
a[1][1][1] 1040
a[1][1][2] 1044
找找规律就懂了
以上就是关于如何用一个C语言函数返回一个数组的首地址全部的内容,包括:如何用一个C语言函数返回一个数组的首地址、C语言:对一维数组名取地址运算,怎么理解为指行的指针例:a[2][3],&a[0]指行二维数组的、C语言中如何用指针来取得多维数组地址的写法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)