#include<stdio.h>
#include<malloc.h>
void main()
{
int a[5] = {4,10,2,8,6};
int len;
printf("请输入你需要分配的数组的长度:len=");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof(int)*len); //malloc 是系统函数
*pArr = 4; //类似于 a[0] = 4;
pArr[1] = 10; //类似于 a[1] = 10;
return 0;
}
int* pArr = (int*)malloc(sizeof(int)*len); 如果len占5个字节的话,那么 malloc(sizeof(int)*len)=20 个字节, 20表示的是这个malloc函数请求操作系统要为我们的程序分配20个字节的空间,就是提供20个字节的空间来为我们程序进行读写.
malloc函数只能返回第一个字节的地址,这个是系统规定的,第一个字节的地址没有实际含义。因为不能根据第一个字节地址来确定这个变量占了几个字节。因为整形变量占四个字节,它也是以第一个字节地址来表示的,如果这个变量是double类型的话,它也是以第一个字节地址来表示的。无论这个变量占几个字节它都是以第一个字节来表示的,所以malloc返回的第一个字节地址是没有实际意义的地址(干地址)。所以我们需要在 malloc(sizeof(int)*len) 的前面加一个强制类型转换 (int*)malloc(sizeof(int)*len) 来告诉我们的编译器,我们返回的第一个字节地址到底是整型的地址,还是其他类型的地址。所以强制转换成 int * 的话,那么我们的 pArr+1 的话那么它将会指向后面的一个 int * 的位数,会指向后四位,如果强制类型是 double * 的话, pArr + 1 将会指向后八位的地址。
所以我们的 pArr 就等价与 a(数组,数组名表示首地址) , 因为a是指向了第一个元素,第一个元素就占了四个字节。 malloc(sizeof(int)*len) 这个分配了20个字节,malloc返回第一个整型的地址,pArr也指向前四个字节,pArr表示的是整型的地址。 那么 pArr + 1 就是指向了后四位了。
那么 *pArr = 4; //类似于 a[0] = 4;
pArr[1] = 10; //类似于a[1] = 10;
然后就导致了 pArr 表示前四位(第一个字节)
pArr + 1 就指向了后四位(一字节)
#include<stdio.h>
#include<malloc.h>
void main()
{
int a[5] = {4,10,2,8,6};
int len;
printf("请输入你需要分配的数组的长度:len=");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof(int)*len); //malloc 是系统函数
//*pArr = 4; //类似于 a[0] = 4;
//pArr[1] = 10; //类似于 a[1] = 10;
//printf("%d %d\n", *pArr,pArr[1]);
//我们可以把pArr当作一个普通数组来使用
for(int i=0;i<len;++i)
scanf("%d",&pArr[i]);
for(i=0;i<len;++i)
printf("%d\n"*(pArr+i));
free(pArr); //把pArr所代表的动态分配的20个字节内存释放
return 0;
}
free(pArr); //把pArr所代表的动态分配的20个字节内存释放