数组大小的动态分配

1.

 

malloch函数返回的是4个字节中的第一个字节的地址,那为什么要加强制类型转换呢,是因为根据第一个字节地址,可以把8个字节当一个变量也可以把4个字节当一个变量,所以malloc函数返回的是一个无意义的地址也就是干地址,所以需要告诉编译器我们返回的是哪种类型的地址,把第一个字节地址当成一个整形字节地址;所以p存储的是首字节地址1000H

但因为前面有强制类型转换,所以转换成了int *类型,因此p指向前4个字节

*p(含义是以p的内容为地址的变量),代表这四个字节整体,所以自然可以把10赋给这4个字节。

 2.

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 //2020年11月18日21:10:16
 4 void f(int * q)
 5 {
 6   *q=200;  
 7   //free(q);
 8   //把q所指向的内存释放掉,不能用在这,因为q所指向的和p所指向的是同一块内存空间,
 9   //释放掉以后16行的*p会出现错误(因为空间不存在了)  
10 }
11 int main(void)
12 {
13     int * p=(int *)malloc(sizeof(int));//sizeof(int)返回值是int所占的字节数4
14     *p=10;
15     printf("%d\n",*p);
16     f(p);//p是int *类型
17     printf("%d\n",*p);
18     return 0;
19 }

 

 

 

 

 


 

3.

 

 


 

 4.

 

 

#include<stdio.h>
#include<malloc.h>
//2020年11月18日21:43:35
int main(void)
{
   int a[5];// 如果int占4字节,则本数组总共占20字节
   int len;
   int * pArr;
   int i;
   
   //动态的构造一维数组
   printf("请输入数组长度:\n");
   scanf("%d",&len);
   pArr=(int *)malloc(4*len);//所以本行构造了一个动态的一维数组,其功能类似于int pArr[len]
   //因为malloc返回的是20个字节中的第一个字节的地址,
   //因为前面有强制类型转换成了int *类型,所以pArr指向前4个字节
   //所以*pArr代表了前四个字节的内容,
   //pArr+1指向第二个四个字节
   //所以*(pArr+1)代表了第二个四个字节的内容
   /////*pArr等价于pArr[0],*(pArr+1)等价于pArr[1]////
   
   //对一维数组进行操作:赋值
   for(i=0;i<len;i++)
       scanf("%d",&pArr[i]);
   //对一维数组进行输出
   for(i=0;i<len;i++)
       printf("%d\n",pArr[i]);
   free(pArr);//释放掉动态分配的数组
   for(i=0;i<len;i++)
       printf("%d\n",pArr[i]);//会输出一堆垃圾值
   return 0; 
}

 


 1 #include<stdio.h>
 2 #include<malloc.h>
 3 int main(void)
 4 {
 5     int a[5]={1,2,3,4,5};
 6     
 7     int len;
 8     printf("请输入你需要分配的数组长度:len=\n");
 9     scanf("%d",&len);
10     int * pArr = (int *)malloc(sizeof(int)*len);
11     //pArr指向了前四个字节,pArr+1指向后四个字节
12     * pArr = 4;//类似于a[0]=4;可以把pArr当数组名处理
13     pArr[1] = 10;//等价于* (pArr+1) = 10;
14     free(pArr);
15     
16     return 0;
17 }

 

posted @ 2020-11-18 21:49  Connor_Jiao  阅读(520)  评论(0编辑  收藏  举报