关于malloc的一些问题,到底怎么回事!帮忙解释清楚吧

来源:百度知道 编辑:UC知道 时间:2024/05/16 04:57:56
对于这个,编写程序,利用malloc函数开辟动态存储单元,存放输入的三个整数。然后按从大小到大的顺序输出这三个数
#include<stdio.h>
#include<stdlib.h>

void main()
{
int *p, tmp, i, j;

printf ("Input 3 numbers: ");
p = (int*)malloc(3*sizeof(int));
for(i=0;i<3;i++){
scanf ("%d", p+i);
for(j=0;j<i;j++)
if(p[i]<p[j]) {
tmp = p[j];
p[j]= p[i];
p[i]= tmp;
}
}
printf ("\n%d, %d, %d", *p, *(p+1), *(p+2));
}
我不是很明白
if(p[i]<p[j]) {
tmp = p[j];
p[j]= p[i];
p[i]= tmp;
变量p不是一个指针吗?为什么会变成数组?p在这里到底是什么意思,怎么应用的?指针用数组不是要先定义或者说明一下吗?麻烦帮帮忙

在这有个概念你要明白
int a[100]; 如果你单独使用a 它就是一个指针 指向a[0]
这里你给p分配了3个int大小 他就相当于p[3]
当然可以这么使用
你也可以这样使用 *(p+i)等价于p[i]

p是指针,指针是一种数据类型,不是数组,数组是一种数据结构,数组可以看成是存储于一个“连续存储空间”中的相同数据类型的数据元素的集合

在这段连续存储空间中,p可以指向其中任意一个元素,也就是p的值可以是其中任意一个元素的地址,假设A是一个正整数,只要(p+A)和(p-A)还在这段存储空间中(也就是没有越界),那么就可以通过*运算符获取该地址中的值,也就是*(p+A)和*(p-A),也等价于p[A]和p[-A],还有一种不常用的表示方法,等价于A[p]和(-A)[p]

假设一个数组int a[10],数组名a就是一个指针,而且它的值是a[0](第一个元素)的地址,所以a[0]就相当于*(a+0),a[9]相当于*(a+9),考虑a[10]的情况,因为a+10已经不在这段连续空间内了,也就是越界了,所以进行a[10]或者*(a+10)的时候,会出错

你的例子中通过malloc申请了一段连续内存,这段内存中可以存放3个相同数据类型的(int)元素,并且把第一个元素的地址返回给了p,那么p[0]就是第一个元素,p[1]就是第二个元素,p[2]就是第三个元素
假设让p=&p[1](第二个元素的地址),那么现在p[-1]就是第一个元素,p[0]就是第二个元素,p[1]就是第二个元素

p = (int*)malloc(3*sizeof(int));这个语句就是动态申请一块空间,并把这块空间的首地址给P,而这个首地址作为也数组的首地址。所以不是变成数组。
严格地说,一个指针是一个地址,只不过它指向数组的首地址。这里的p说白了就是一个地址。

p[i],数组名p的正真含义是该数组的首地址,也是地址。p[i]就是存放在地址上的数。所以p不是变成数组,是数组名。

p = (int*)malloc(3*sizeof(int));假如我们获得了内存中100-112这块内存,(假定整形占4个字