消息关闭
    暂无新消息!

自学新人提问:malloc,p[i]使用

问题作者 : 老转2017-07-04发布
练习题:建立动态数组,输入5个学生的成绩,调用函数检查是否有成绩低于60,并输出该成绩。


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main ()
{
void check(int *p);
int *p1,i;
p1=malloc(5*sizeof(int));
for(i=0;i<5;i++)
scanf("%d",p1+i);
check(p1);
getch ();
return 0;

}
void check(int *p)
{
int i;
printf("they are fail:");
for(i=0;i<5;i++)
if(p[i]<60) printf("%3d",p[i]);            //这一行为什么可以直接使用p[i],我用*(p+i)结果是一样的,这里有什么不同?

}

6个回答

︿ 1
直接使用p[i],我用*(p+i)结果是一样的,这里没有什么不同
一个是靠下标指向元素的位置,一个靠内存偏移指向元素的位置。
︿ 1
A[B]
*(A+B)
*(B+A)
B[A]
//以上四行等价

"abc"[1]
*("abc"+1)
*(1+"abc")
1["abc"]
//以上四行等价

A[0]
*(A)
0[A]
//以上三行等价
︿ 1
编译器总是把以下标的形式的操作解析为以指针的形式的操作。
p[i]这个操作会被解析成:先取出p 里存储的地址值,然后加上中括号中i个元素的偏移量,计算出新的地址,
然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了。

从抽象的角度理解,指针和数组是外在形式,本质上都是对内存地址的读写操作。

如果有帮助,请采纳答案好吗,谢谢!