直接上代码分析
#include <stdio.h>
#include <string.h>
#include <malloc.h>int mian() {int a[5] = { 1,5,8,46,12 };int len;printf("请输入你要分配数组的长度: len=");scanf("%d", &len);int * pArr = (int *)malloc(sizeof(int) * len); //为什么这里要使用强制类型转化?//malloc函数返回的是第一个元素地址,//这个第一个元素地址是没有意义的,因为double int char类型都一样返回第一个元素地址,//程序无法知道这个第一个元素地址是什么类型的和占几个字节,//所以需要强制类型转换告诉程序malloc函数返回的第一个元素地址的什么类型的*pArr = 4; //类似于 a[0] = 4;pArr[1] = 10; //类似于 a[1] = 10;}
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 就指向了后四位(一字节)
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个字节内存释放