首页
社区
课程
招聘
[旧帖] [求助]问些小问题,主要是C和平时的操作 0.00雪花
发表于: 2009-7-4 10:56 6699

[旧帖] [求助]问些小问题,主要是C和平时的操作 0.00雪花

2009-7-4 10:56
6699
平时操作电脑的时候多少会碰到一些问题不太明白,又不方便查,这里提一些小问题请大牛们稍微花点时间能够替我这样的小菜解惑,感激不尽。
1. 关于光盘里的文件
我们平时经常使用光盘。但是由于小弟我电脑是IBM的x61,本身不带光盘,所以经常需要借用别人的电脑把光盘做成iso格式存起来,甚至需要把启动盘的iso做到U盘里。
当时刚入手这个小本的时候,不会做启动U盘。小弟我用虚拟光驱加载iso文件,直接复制到U盘里,这样在BIOS里选择U盘启动却会失败。但是后来用一些专门做启动盘的软件来把文件放到U盘上,就能够以U盘引导电脑装系统。这里的问题就是,直接复制文件和用专门的软件来刻录的区别在哪?~~

2.关于C的指针问题
平时编写C程序,当使用字符串时,经常喜欢定义*s="abcd"这样的。学C的时候,老师说*s和s[]其实是一个意思,s都是指向字符串头的字符型指针。但是看一些别人的程序,似乎char *s与char s[]还是有一些差别的。这里的差别都有什么呢?

3.还是关于C的问题
上数据结构课,老师的一个程序用到了函数指针。因为以前没接触过,感觉相当神奇。
以前一直没有想过在C里函数名到底是什么。像别的东西,比如上面提到的字符串,其名字我的理解看来就是一个字符型指针。但是函数名实在不知道是什么。

4.C++的一个问题
有一天写了一个程序
#include <iostream.h>
ostream main()
{
        return cout<<"Hello World"<<endl;
}

VC编译通过,但是链接的时候报错。
这里 如果把main的返回值改成引用类型
ostream& main()
这样写的话能正常执行。
实在是想不明白其中的理由。

呵呵,一些平时碰到的小问题。谢谢来看的各位和回答的大牛们~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第二问我知道一点点
*s="abcd",s是一个变量,编译器会为它分配一个空间。
s[]中,s是一个地址,编译器会为数组s分配一个空间,不会为s本身分配空间,s指向s[]的首地址
会有s=&s[0],*s=s[0]
2009-7-4 12:33
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
- -啥意思?~!没看懂。。。s[]的s不分配空间?~它不是一个char型指针吗?
2009-7-4 12:43
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
4
2.自己看内存 比别人讲得更直观
3.函数指针就只是函数的地址 类似于00400000之类的
  搞那么多名堂是给程序员和编译器看的
4.<<的返回值为ostream&
2009-7-4 12:46
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
2. 怎么看内存?~
3. 我知道iostream.h里把cout定义成ostream&类型。但是把头文件改了也不能成功。。
2009-7-4 12:51
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
6
2. 晕,老师连这个都没教? 用编译器自带的调试器或者第三方调试器调试下 再打开内存窗口就可以了
4. cout是ostream类的实例对象 要改也是改成员方法<<的返回值
   出了错要先从自己的代码找起阿
2009-7-4 13:03
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
7
你们老师在误人子弟..

void main()
{
    char *s1="abcd";
    char s2[] = "abcd";
    ...
}
s1在堆上. s2在栈中. (连个串都存在PE文件的数据区段.)
2009-7-4 13:39
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

我在2楼的回答貌似让人看了更加不懂
我的表达能力太差了
楼主还是自己调试下吧
2009-7-4 14:57
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=jackozoo;650791]你们老师在误人子弟..

void main()
{
    char *s1="abcd";
    char s2[] = "abcd";
    ...
}
s1在堆上. s2在栈中. (连个串都存在PE文件的数据区段.)[/QUOTE]

- -不好意思,我们还没学过计算机组成原理。。。S2在栈中,是指系统栈吗?堆又是什么?~
ps:谢谢各位的回答
2009-7-4 18:16
0
雪    币: 358
活跃值: (662)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
一个由 c/C++ 编译的程序占用的内存分为以下几个部分:

1 、栈区( stack )— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2 、堆区( heap )— 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3 、全局区(静态区)( static )— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由有系统释放。

4 、文字常量区 — 常量字符串就是放在这里的。程序结束后由系统释放。

5 、程序代码区 — 存放函数体的二进制代码。
2009-7-4 19:22
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
原来如此,很清楚~谢谢`
2009-7-4 19:40
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
一个进程一个堆,一个线程一个栈
2009-7-4 19:51
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
emc
13
第2个问题:

如果声明的语法是
char *s = "hello world";
这样的时候,起始,这是c中的一种约定,其实 是分2步来实现的,首先为"hello world"这个字符串分配以个内存,然后在把这个内存的首地址传送到s变量中保存,相当于:
char array[] = "hello world";
char *s =  &array[0];

但是这个数组是没有名字的,所以被称为"无名数组"。

第3个问题:

我觉得函数名就是这个函数的首地址,不过这个地址是在代码段中的,页就是jmp到这个地址来执行代码的意思,函数指针无非就是保存了这个地址,然后远程访问而已。

ps:以上观点属于个人意见,如果说错了,还请各位客气的指正,谢谢了。
2009-7-4 22:47
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
感谢楼上的回答。对于第3个问题,我曾经试过这样一个实验
首先定义一个函数比如叫fun();
然后 在main里
printf("%d,%d,%d",fun,&fun,*fun);
输出的结果是三个数值完全一样!!
我想,如果函数名只代表一个地址的话,断然不能有这样的输出结果吧。
2009-7-4 23:21
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼上做的实验还真不知道怎么解释
我先调试下看
2009-7-6 08:36
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
进来学习。。。。。。
2009-9-9 12:26
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
刻录文件时 还要写磁盘扇区 以保证能启动



fun  函数名当然就是函数的地址
&fun  函数名的地址当然就是函数的地址
*fun  这个意思大概是指函数的值 他的值还是保存的函数地址吧

也是新手 解决不一定正确
2009-9-9 14:01
0
雪    币: 91
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
C函数对应的汇编就是CALL,函数名就是这个call的入口地址。我是这样理解的,不知道正确否
2009-9-9 20:04
0
游客
登录 | 注册 方可回帖
返回
//