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 ",*p); 16 f(p);//p是int *类型 17 printf("%d ",*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("请输入数组长度: "); 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 ",pArr[i]); free(pArr);//释放掉动态分配的数组 for(i=0;i<len;i++) printf("%d ",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= "); 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 }