| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 369 人关注过本帖
标题:关于C语言方面一些疑问,求教指导
只看楼主 加入收藏
夜风缘
Rank: 2
等 级:论坛游民
帖 子:18
专家分:15
注 册:2017-2-16
结帖率:66.67%
  已结贴   问题点数:34  回复次数:3   
关于C语言方面一些疑问,求教指导
1、
#include <stdio.h>
int main()
{
int i;
double sum;
i=1;sum=0;
do
sum+=1/i;//出错
while(++i<=10);
printf("%s",sum);
}
//计算1+1/2+1/3+……+1/10
请问上面为什么错了?
2、
char s[20]="phpto",*p=s;
char **p2=&p1;
请问表达式p2+=2为什么语法错误?
3、
void fun1(int *x,int *y)
{
int *p;
*p=*x;
*x=*y;
*y=*p;
}
void fun2(int *x,int *y)
{
int *p;
p=x;
x=y;
y=p;
}
void fun3(int *x,int *y)
{
int p;
p=*x;
*x=*y;
*y=p;
}
三个fun函数只有第三个可以成功交换,请问哪里错了吗,我知道是地址传递,可是总分不清。
4、
不合法main函数命令行参数表示形式:main(int argc,char *argv)
为什么不合法?
5、
定义结构体:
struct x
{
int x1;
int x2;
};
struct y
{
int y1;
float y2;
}y;
请问哪里出错了?
6、
链表:
p、q分别是指向链表的当前结点和下一结点,则以下可以将q所指结点从链表中删除并释放该节点的程序段是 1
1.(*p).next=(*q).next;free(q);
2.q=(*q).next;(*p).next=q;free(q);
为什么2语句就算错呢?
7、
struct person
{
int a;
int b;
struct person *next;
}class[100];
则class[10]所占内存单元的字节数为 12.
请问字节数是怎么得来的?



只有34分,还请不要介意。
2018-03-10 22:30
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:34 
#include <stdio.h>
int main()
{
int i;
double sum;
i=1;sum=0;
do
sum+=1/i;//出错
while(++i<=10);
printf("%s",sum);
}
//计算1+1/2+1/3+……+1/10
请问上面为什么错了?
答:1是整型常量,i是int数据类型。1/i结果不会是浮点类型
2、
char s[20]="phpto",*p=s;
char **p2=&p1;
请问表达式p2+=2为什么语法错误?
答:因为p2是二级指针。你可以这样看*(*p2)
3、
void fun1(int *x,int *y)
{
int *p;
*p=*x;
*x=*y;
*y=*p;
}
void fun2(int *x,int *y)
{
int *p;
p=x;
x=y;
y=p;
}
void fun3(int *x,int *y)
{
int p;
p=*x;
*x=*y;
*y=p;
}
答:fun1的p指针没赋值没初始化,是野指针。fun2的x,y只能改变形参,所以fun2无效。
三个fun函数只有第三个可以成功交换,请问哪里错了吗,我知道是地址传递,可是总分不清。
4、
不合法main函数命令行参数表示形式:main(int argc,char *argv)
为什么不合法?
答:正确写法:int main(int argc, char *argv[])
5、
定义结构体:
struct x
{
int x1;
int x2;
};
struct y
{
int y1;
float y2;
}y;
请问哪里出错了?
答:请看一下这样的写法:
struct y
{
int y1;
float y2;
};
struct y y;
知道哪里错了吧?

6、
链表:
p、q分别是指向链表的当前结点和下一结点,则以下可以将q所指结点从链表中删除并释放该节点的程序段是 1
1.(*p).next=(*q).next;free(q);
2.q=(*q).next;(*p).next=q;free(q);
为什么2语句就算错呢?
答:原因出在q=(*q).next;所以free(q)其实free的是(*q).next
7、
struct person
{
int a;
int b;
struct person *next;
}class[100];
则class[10]所占内存单元的字节数为 12.
请问字节数是怎么得来的?
答:int a  4   int b   4  *next   4


[此贴子已经被作者于2018-3-11 08:40编辑过]


普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-11 00:52
夜风缘
Rank: 2
等 级:论坛游民
帖 子:18
专家分:15
注 册:2017-2-16
  得分:0 
回复 2楼 lanke711
首先谢谢您的回答,可还有点不明白。
3、
void fun1(int *x,int *y)
{
int *p;
*p=*x;
*x=*y;
*y=*p;
}
void fun2(int *x,int *y)
{
int *p;
p=x;
x=y;
y=p;
}
void fun3(int *x,int *y)
{
int p;
p=*x;
*x=*y;
*y=p;
}
答:fun1的p指针没赋值没初始化,是野指针。fun2的x,y只能改变形参,所以fun2无效

问:fun2的形参是指针,定义的*p也是指针,通过p=x,x=y,y=p,改变的应该是地址(p代表地址,*p代表指针指向元素的值,这样理解没错吧),
而地址传递不是不受形参实参影响吗?
难道地址改变也属于形参范围内,不能被传递回去的吗?
或者那个地址传递,我理解是通过定义的指针使指向的元素发生变化,这种变化直接改变了被指向元素的值,这种变化是不受单向传递的影响的。
这样理解不知道对不对?


5、
定义结构体:
struct x
{
int x1;
int x2;
};
struct y
{
int y1;
float y2;
}y;
请问哪里出错了?
答:请看一下这样的写法:
struct y
{
int y1;
float y2;
};
struct y y;
知道哪里错了吧?

问:定义结构体不还可以定义结构体类型的同时定义结构体变量吗,比如:

struct student
{
    char no[20];        //学号
    char name[20];     //姓名
      char sex[5];      //性别
    int age;            //年龄
} stu1,stu2;   


[此贴子已经被作者于2018-3-11 14:02编辑过]

2018-03-11 14:00
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:0 
回复 3楼 夜风缘
1.C语言都是值传递,指针的值是地址。
2.
struct y//结构体名是y
{
    int a;
    ....
}y;//结构体变量也是y
产生歧义。
到底是哪个y?

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-18 04:34







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021297 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved