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])是什么意思?ptr不是指针变量吗?
展开
 我来答
奇衡一
2019-08-01 · 知道合伙人互联网行家
奇衡一
知道合伙人互联网行家
采纳数:26 获赞数:319
网络工程师,参加过多届CTF网络安全挑战赛。

向TA提问 私信TA
展开全部

C语言里面的指针和数组是很有趣的。
例如定义数组a[10],你可以通过a[1]访问里面的元素,也可以通过*(a+1),来访问。
为什么这里可以这样用呢?
ptr的类型为(int *),所以ptr在内存里面存放的就是int类型的指针,指向了某个int地址。正常情况下,你可以通过ptr访问它指向的某一个地址里面的数据,如下图可以看到22。



你这里的程序里面有一个malloc函数,它的功能就是申请空间,本来只有一个空间的,申请之后就可以有很多连续的空间了。这个时候如果ptr里面的值0000001加上1就指向了22下方的空间了,可以继续存东西了,如图所示。


这就是指针有趣的地方所在,它可以直接控制地址空间。ptr[i]的意思就是 就和*(ptr+i)一样。
所以scanf的时候可以直接往ptr[i]这个地址放东西。
类似的,char *p也可以变成数组,只要你给了他空间。这个在数据结构和算法里面用得很多,也很有意思,不过容易把自己绕晕。

更多追问追答
追答
另外补充一个知识点,int *p可以表示一维数组,int **p可以用了表示二维数组。为什么用这种方式而不是直接用 p[]呢,很明显,int  *p这种模式的数组空间大小可以在程序运行时自由变化,可以不断扩充空间或者缩减空间。而p[]的数组大小在初次定义时就被限定了。
追问
ptr[i]是地址,那为什么scanf存入时,在ptr[i]前还要加&?
清湛且鲜活灬桃花5795
2019-08-01 · TA获得超过3082个赞
知道大有可为答主
回答量:5373
采纳率:82%
帮助的人:643万
展开全部
1、给指针变量赋初值在语法上是没有错误的,编译执行也可以通过,但是一旦代码量增多后,很容易造成指针的错用,为了防止这一问题最好将指针变量定义的时候就置成NULL,这样做是为了代码安全着想。 2、指针定义后就会随机指向一个位置的,编译的时候也不会提示错误,程序短很容易找出来,长了多了就难找了,所以这是一个好习惯吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式