#include<stdlib.h>
char ga[]="abcdefghijklm";
void my_array_func(char ca[10])
{
printf("addr of array param=%#x /n",&ca);
printf("addr of ca[0]=%#x /n",&ca[0]);
printf("addr of ca[1]=%#x /n",&ca[1]);
printf("++ca=%#X /n",++ca);
}
void my_point_func(char *pa)
{
printf("addr of array param=%#x /n",&pa);
printf("addr of ca[0]=%#x /n",&pa[0]);
printf("addr of ca[1]=%#x /n",&pa[1]);
printf("++ca=%#X /n",++pa);
printf("%d/n",sizeof(pa[2]));
}
int main()
{
printf("addr of global array=%#X /n",&cd);
//printf("addr of global array=%#X /n",*(cd+1));
printf("addr of global array=%#X /n",&ga);
printf("addr of ga[0]=%#X /n",&ga[0]);
printf("addr of ga[1]=%#X /n",&ga[1]);
////printf("++ga=%#X /n",&ga[1]);
printf("%d/n",sizeof(ga));
my_array_func(ga);
my_point_func(ga);
system("pause");
}
/*
声明如果没有声明的话三个函数不变
在没有char cd[]="44523";这句话
程序头为
#include<stdio.h>
#include<stdlib.h>
char ga[]="abcdefghijklm";
时
结果如下
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在加上char cd;后
程序头变为
#include<stdio.h>
#include<stdlib.h>
char cd;
char ga[]="abcdefghijklm";
结果
addr of global array=0X404010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在程序头为
#include<stdio.h>
#include<stdlib.h>
int cd;
char ga[]="abcdefghijklm";
结果是
addr of global array=0X404010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在加上 char cd[]="44523";后
程序头变为
#include<stdio.h>
#include<stdlib.h>
char cd[]="44523";
char ga[]="abcdefghijklm";
结果
addr of global array=0X402000
addr of global array=0X402006
addr of ga[0]=0X402006
addr of ga[1]=0X402007
14
addr of array param=0x22ff20
addr of ca[0]=0x402006
addr of ca[1]=0x402007
++ca=0X402007
addr of array param=0x22ff20
addr of ca[0]=0x402006
addr of ca[1]=0x402007
++ca=0X402007
1
请按任意键继续. . .
更改
char cd[]="44523";
char ga[]="abcdefghijklm";
两句的位置后
结果如下
addr of global array=0X40200E
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
基于以上可以得出
//应该说程序为变量分配内存会因数据类型不同而分在相应的区块里
//所以如果第一句为char cd;的话,不会影响到ga的值,因为ga是数组里的
//第一个量,它分配在了第一个位置上,仅此而已 。(这是徐悦竹老师讲的)
同时可以看到一个char型变量是占一个内存单元cd数组有5个元素,首元素为
0X402000,则第五个为0X402005,然后紧接着ga的首元素为0X402006
那么int呢
程序头变为
#include<stdio.h>
#include<stdlib.h>
int cd[]={4,4,5,2,3};
char ga[]="abcdefghijklm";
结果为
addr of global array=0X402000
addr of global array=0X402014
addr of ga[0]=0X402014
addr of ga[1]=0X402015
14
addr of array param=0x22ff20
addr of ca[0]=0x402014
addr of ca[1]=0x402015
++ca=0X402015
addr of array param=0x22ff20
addr of ca[0]=0x402014
addr of ca[1]=0x402015
++ca=0X402015
1
请按任意键继续. . .
这是个比较不一样的地方,int型是比char型大一倍,但是13不是5的倍数(cd有5个int元素)
猜测:int后应该会有个收尾的工作,占了3个字节
我再次把
int cd[]={4,4,5,2,3};
char ga[]="abcdefghijklm";
两句调换位置
此时程序头为
#include<stdio.h>
#include<stdlib.h>
char ga[]="abcdefghijklm";
int cd[]={4,4,5,2,3};
结果为
addr of global array=0X402010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
可以看到在cd为char型数组变量的时候,系统在为ga分配完内存后直接给cd分配内存
addr of global array=0X40200E
addr of global array=0X402000 说明在ga的13个元素后直接给cd分配内存了
即(cd=ga尾元素+1)
而在cd为int型数组