鱼C论坛

 找回密码
 立即注册
查看: 4619|回复: 7

C程序改错题

[复制链接]
发表于 2012-12-13 22:17:24 | 显示全部楼层 |阅读模式
5鱼币
#include<stdio.h>
void main()
{
int a[]={1,2,3,4,5,6,7,8,9},*p;
*p=a;
printf("%f\n",*p+9);
}
已知*p=a;
printf("%f\n",*p+9);
是错的。
答案改为p=a;
printf("%d\n",*p+9);
正确吗?
我想改为p=&a[0];
printf("%d\n",p+9);
这样行吗?
求鱼油们指教!!!

最佳答案

查看完整内容

/* 加入你改为 *p = a; 这句话的意思是: 将数组a的首元素地址给了*p, *p里现在存的是 数组a的首元素地址 ; *p 的类型是一个int型的, a 是一个32位的地址 所以编译器会报警告, 但你可以强制转化 *p = (int)a; p = a; 这样当然是正确的. 因为p是一个指向int型的指针. ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-13 22:17:25 | 显示全部楼层
本帖最后由 寒小咸 于 2012-12-13 22:51 编辑

/*
        <1>  加入你改为 *p = a;
                 这句话的意思是: 将数组a的首元素地址给了*p,
                 *p里现在存的是 数组a的首元素地址 ;
                 *p 的类型是一个int型的, a 是一个32位的地址
                 所以编译器会报警告, 但你可以强制转化
                 *p = (int)a;
                 
        <2>  p = a;
                 这样当然是正确的. 因为p是一个指向int型的指针.
                 而a数组的元素也是int型的. 所以正确的.

        <3> p = &a[0];
                也是正确的.
                &a[0] 是取a数组第一个元素的地址然后给了p
                这等价于 p = a;
                所以是正确的
               但你的输出语句: printf("%d\n", p+9);
               是不对的, p是一个地址, p + 9 相当于
              指向了数组的后面,也就是越界了.
              printf("%d\n",*p+9)就正确了
*/
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 22:43:27 | 显示全部楼层
首先p是指针变量,a是数组名,即数组首地址,如果*p=a;则;相当于printf("%f\n",a+9);因为a是地址,所以不对,改为p=a后,可以通过printf("%f\n",*p+9);的方式输出,得到的结果是数组第一个元素值加9。改为p=&a[0];后输出格式又错了,变量p+9还是地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 23:00:07 | 显示全部楼层
貌似不行,起码printf("%d\n",p+9);应该写成printf("%d\n",*p+9)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-13 23:42:55 | 显示全部楼层
首先a表示的是数组的首地址,所以就不需要用*p = a;用p = a 就OK了,至于输出,如果是想第一个元素加9的话应该用*p+9,如果想表示指向最后一个元素的话,那应该是*(p+8);不能加9,加9 就越界了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-14 00:07:57 | 显示全部楼层
因为这里p是指针,想当于是一个地址你如果输出p+9那是地址P加上9,虽然程序不会出错,但是前面的数组就没有意义了。
int *p; 这里的*只是定义p是指针类型
而p=a;是把a的地址赋值给P这里就不用加*(再加*就变成读取P所代表的内存空间的值了)
所以输出里应该是 printf("%d\n",*p+9)注意这里要用*
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-14 12:05:42 | 显示全部楼层
*p+9应为*(p+9)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-15 14:53:54 | 显示全部楼层
亲,你是想输出什么内容呢?p+9你用%d输出是地址的意思,但是也是错误的哦,p+9指向超出数组a的长度范围了哦!*p+9是取p指向的地址的内容+9哦!p是指针变量哦,*p是指向的地址里存储的内容哦!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 22:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表