c语言指针变量问题

#include<Stdio.h>#include<stdlib.h>main(){int*ptr=NULL;intnum,i;printf("请输入待输入的整数的个数"... #include<Stdio.h>
#include<stdlib.h>
main()
{
int *ptr=NULL;
int num,i;
printf("请输入待输入的整数的个数");
scanf("%d",&num);
ptr=(int *)malloc(num * sizeof(int));
for(i=0;i<num;i++)
{
printf("请输入第%d个整数",i+1);
scanf("%d",&ptr[i]);
}
printf("你输入的整数是:");
for(i=0;i<num;i++)
{
printf("%d",ptr[i]);
}
free(ptr);
return 0;
}
scanf("%d",&ptr[i])是什么意思?printf("%d",ptr[i])可以直接输出ptr指针?ptr不是指针变量吗?为什么使用scanf存入时好要在ptr前加&?
展开
 我来答
金色潜鸟
2019-08-01 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5479万
展开全部
c 语言中,形式逻辑不成立,指针书写的外形,在声明中和在语句中,外貌相同,意思不同!
int *ptr; 这是声明,声明 ptr 是指针,用于指向 int 型变量。
语句中 *ptr 表示 指针指向的数值, ptr 表示 指针指向的地址。有*的是值,没星号的是地址。
ptr=(int *)malloc(num * sizeof(int)); 这是动态分配,分配了num个int型数值的存放空间,ptr 表示 指针指向的地址(分配了的空间的“始地址”)
你也可以理解成,定态声明了数组: int ptr[num]; 数组名ptr, 有 num个元素。
scanf("%d",&ptr[i]); ptr[i] 是数组第i号元素的值。&ptr[i] 是数组第i号元素的地址。
printf("%d",ptr[i]); 输出 ptr数组第i号元素的值.
---
深入理解:
语句里,ptr[i] 里的[] 实质上是运算符,ptr[i] 等价于 *(ptr+i)。是值。
语句里,&ptr[i] 等价于 (ptr+i) ,是地址。等于: ptr的地址+i * sizeof(int)。
古或今oE
2019-08-02 · 超过25用户采纳过TA的回答
知道答主
回答量:59
采纳率:66%
帮助的人:19.8万
展开全部
ptr申请了num个int型内存区域后,int *ptr就等价于int ptr[num]。
scanf("%d",&ptr[i])的意思是获取你输入的整数,赋值给ptr[i]。
printf("%d",ptr[i])输出的并不是ptr指针,而是ptr[i]的值,因为数组可以用下标取值。
ptr是指针变量,但是ptr[i]不是指针变量,ptr[i]可以理解为一个int型变量。
使用scanf存入时,&并不是加在ptr上,而是加在ptr[i]上,取的是ptr[i]的地址。[ ]的运算优先级高于取地址符&。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清湛且鲜活灬桃花5795
2019-08-01 · TA获得超过3082个赞
知道大有可为答主
回答量:5373
采纳率:82%
帮助的人:619万
展开全部
1、给指针变量赋初值在语法上是没有错误的,编译执行也可以通过,但是一旦代码量增多后,很容易造成指针的错用,为了防止这一问题最好将指针变量定义的时候就置成NULL,这样做是为了代码安全着想。 2、指针定义后就会随机指向一个位置的,编译的时候也不会提示错误,程序短很容易找出来,长了多了就难找了,所以这是一个好习惯吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
听不清啊
高粉答主

2019-08-01 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.8亿
展开全部
scanf("%d",&ptr[i])是从键盘读入一个十进制整数,并存入到数组元素ptr[i]中。
int *ptr=NULL;
ptr=(int *)malloc(num * sizeof(int));
是根据输入的num的大小动态申请数组的方法。ptr是一个指针(同时也是ptr数组的数组名)
相当于静态申请数组
int ptr[num];
的作用,只是这两都分别从系统的位置不同区域申请内存(初学者可暂时忽略这一点,使用上是完全一样的)。
ptr[i]就是这个数组中的一个成员,加上取地址符&,就是告诉C系统,读取到的数据要存放的位置,
scanf("%d",&ptr[i]);完全等同于scanf("%d",ptr+i);---------scanf函数的使用格式如此,必需要使用数据存放地址的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小悟喵喵
2019-08-02 · TA获得超过421个赞
知道小有建树答主
回答量:283
采纳率:78%
帮助的人:164万
展开全部
int *ptr是指针,malloc了num个int后,ptr指向这段连续的内存,ptr其实就是num个int的数组的头指针,也可以将ptr认为元素是int的数组。[]符号你可以认为是取值操作,那么ptr[0]或者*(ptr)就是第一个元素,ptr[1]或者*(ptr+1)就是第二个元素...
scanf("%d",&ptr[i])就是依次对这个数组(连续的内存)赋值。
scanf的函数定义,这里是个地址,也就是指针,&是取地址操作,也可以写成scanf("%d", ptr+i);
printf("%d",ptr[i])是输出第i个元素(连续内存的第i个值)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式