读书人

[原创]个人C语言精华总结讨论交流区,持

发布时间: 2012-02-05 12:07:14 作者: rapoo

[原创]个人C语言精华总结讨论交流区,持续更新中.......
[color=#0000FF][/color]大家好!!我是C语言的忠实爱好者.在这里,我会把平时总结的点点滴滴在这里与各位分享,希望大家也能把自己的独到见解发表在这里,不需要绝对正确的观点,你的每一个符号就是大家分享知识的源泉。大家努力把这里打造成C语言交流的绝佳平台!!
同时,大家如果有什么问题的话,也可以顶上来,我保证每个问题作仔细的回答.

[解决办法]
好贴占个座
支持你
[解决办法]
举双手赞同楼主,并予以尽可能最大的支持!
[解决办法]
前几天这里有一题 重新搬出来

#include "stdio.h"
main()
{
int i;
char s[]="abcdef";
putchar(i[s]);
}

看好了 是 putchar(i[s]);
不是 putchar(s[i]);

[解决办法]
看好了 是 putchar(i[s]);
不是 putchar(s[i]);
--------------------------
putchar(i[s])==putchar(s[i])
[解决办法]
特别是内存里面取值。
[解决办法]
考同济?
[解决办法]
看好了 是 putchar(i[s]);
不是 putchar(s[i]);

这一句也是正确的?怀疑!
用cl调试出现运行错误,不知道楼主用的是什么编译器,可以正确运行?
[解决办法]
为什么putchar(i[s])==putchar(s[i]);
[解决办法]
putchar(i[s])确实使正确的,为什么呢?
[解决办法]
前几天有人讨论过了
搜搜前几天的帖子吧
[解决办法]
收藏了
[解决办法]
putchar(i[s])==putchar(s[i]);
------------------------------
在Borland的编译器中是正确的,在VC中就完蛋了!
估计Borland编译器不知道怎么优化了,反汇编出来的信息i[s]和s[i]完全一样(CB 6)。
[解决办法]
收藏先
[解决办法]
多贴心得啊 加油
[解决办法]
ding
[解决办法]
答楼主:
void main()
{
int a[3];//向系统申请了从地址a开始,长度为3*sizeof(int)的空间,这个空间再数组的生命期内不会被再次分配
scanf("%d",&n);
for(i=1;i <=n;i++) //i=1,表示从a[1]开始赋值
//c语言不检验数组的边界,超过边界后有两种结果:1、如果数组边界后面的空间已经被分配给了别的变量,就会将别的变量的值覆盖掉。2、如果数组边界后面的空间还没有被系统分配过,那么随时都有被分配的可能,此时数组越界的值就不能得以保证。
scanf("%d",&a[i]);
printf("a[%d]=%d",i,a[i]);
//再用指针指向常量地址a;
int *p=a;
printf("%d",*p); //错误的数值,原因是你前面就没有给a[0]赋值(是从a[1]开始赋值的)。
printf("%d",*(p+1));//输出是a[1]值
}
[解决办法]
请教大家一个问题
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
FILE* BinFile;
if((BinFile = fopen("test.bin","wb")) == NULL)
{
ShowMessage("Fail to ctrate file!!");
return;
}
for(i=0;i<0xff;i++)
fputc(0x0d,BinFile);
fclose(BinFile);


}
程序执行完毕以后产生的文件数据为0xff而不是0x0d,请问大家是什么原因?

[解决办法]
fputc的原形如下:


int fputc(int ch, file *fp)
其中的参数ch是一个int型的参数,在函数内部处理时会舍去高位字节。
[解决办法]
哇, 定
[解决办法]
如何准确知道后面地址有变量值,有函数提取这个地址值和变量值吗?
-----------------------------------------------------
没有,c语言不检测边界,对边界的检测必须靠程序员自己来实现.
举一个覆盖别的数据的例子:
#include <stdio.h >
main()
{
int n,i;
char b[]="hello";
char c[]="word";
int a[3];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf(" %d",&a[i]);
printf("char b[]=%s\n",b);
printf("char c[]=%s\n",c);
for(i=0;i<n;i++)
printf("a[%d]=%d\n",i,a[i]);
system("pause");
}
当超过边界时,就会覆盖到b[]和c[]的数据
[解决办法]

#include "stdio.h"
main()
{
int i;
char s[]="abcdef";
putchar(i[s]);
}


putchar(i[s]); ==putchar(s[i]);
[解决办法]
C语言是门充满陷阱的语言。很多情况需要编程者自己明确把握,比如数组越界,内存泄漏,指针乱飞,语言本身帮不了你,编译器也没辙,只有靠编程者的经验和良好的编程习惯。
[解决办法]
putchar(i[s]); ==putchar(s[i]); 明显说不通嘛,但竟然有些编译会让它过,晕

#include "stdio.h"
main()
{
int i;
char s[]="abcdef";
putchar(i[s]);
}
上面代码GCC可以编译通过,但运行就出错了
[解决办法]
i没有初始化是个随机值,i【s】可能访问越界了
[解决办法]
这里有没有考研一族的。我考浙江工业大学
--------------------------------------------------
答楼主:
有啊,我就是,不过已经考上了。现在研二。祝明年你也成功...
[解决办法]
楼主,请注意公共课一定要过线啊!!!
[解决办法]
的好累,有有人指迷津
[解决办法]
to ls
迷在哪里了?说出来看看! ^_^
[解决办法]
mark一下
[解决办法]
考研还考C语言啊?真是奇怪!什么专业的啊。
[解决办法]
我也考研,中国科学院。专业考C和数据结构
[解决办法]

C/C++ code
#include "stdio.h" main() {      int i;      char s[]="abcdef";      putchar(i[s]); }
[解决办法]
关于指针数组
int *p[3],b=3;
p[0]=&b;
分配给指针数组每个元素的空间几个字节. 另外实际使用中,指针数组,我觉得不是很有用. 反而加大了运用难度和程序易理解性. 大家说对吗?


分配给p每个元素的空间是 sizeof(int *),4个字节。
指针数组用处还是很多的,还有函数指针数组用处也多。

[解决办法]
经典的证明
[解决办法]
经典的证明
[解决办法]
楼主我是来支持你的
[解决办法]
与电脑有关(cpu的位数),与操作系统没关系!-----个人观点,未经验证的!


[解决办法]
我考研,报的是华北计算机系统工程研究所,也不知道怎样,呵呵.考C和C++
[解决办法]
1拷贝构造函数中不能有什么性质的变量?
2指针传递,引用传递,值传递有什么区别,各自性质在哪?
3怎样杜绝"野指针"?
4写一段泄漏内存的伪代码!
5怎样避免函数的覆盖,隐藏?
6malloc/free和new/delete的区别?
7写出malloc/free原形?
8getchar()返回的什么类型的值?
9写出赋值函数的伪代码(就是其中的几个重点)?
10return不能返回什么内存性质的指针和引用?

以上问题仅供交流,并无它意,本人在学习C++过程中总结了25道经典的问答题,其实学好C++主要就是学习它的OOP面向对象的编程思想,以上是前十道题,我会在后期陆续公布后15道题,最主要的目的就是交流,无论你是考研的,还是在校的本科生这些问题你以后都将遇到

继续学习交流吧
[解决办法]
putchar(i[s])?搞不懂为什么
[解决办法]
a[2.2]
Linux下gcc编译不通过
提示信息:size of array `array' has non-integer type
`array'是我定义的数组的名字.
[解决办法]
祝你马到功成
[解决办法]
putchar(i[s]) == putchar(s[i]);

这个问题别再讨论了,好吗?

不明白的人去看<C/C++代码精粹>这本书,里面有详细的解释。

而且,前几天有一贴,专门讲这个问题了,代码大概是这样的:

C/C++ code
#include <stdio.h>int main(){     int i;    int a[2][3] = {1, 2, 3, 4, 5, 6};        for (i = 0 ; i < 6; i++)    {        printf("%d ", *(*a+i));    }    printf("\n");    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>int main(void)  {      int i;    char s[]="abcdef";    for(i=0;i<6;i++)    {        putchar(i[s]);          printf("\n");    }    return 0;}
[解决办法]
int a[3] = {1, 2, 3};
int* p = a;

则可以用*(p+i)来访问数组a中的元素,按照加法交换律,同理*(i+p)也是正确的,根据前面的转换,逆推回去,就是这样的

的了 i[p];

[解决办法]
但是这种写法玩还行,千万别在实际中这样写,轻则被骂,重则炒鱿鱼
[解决办法]
66楼,你的代码是用指针访问数组,跟用数组名访问数组有什么关系?
还有为什么让大家不要讨论了呢?不明白就要讨论.不能说别人讨论过我们就不能再讨论吧?
或者是你明白了,所以看着这个就烦,那还请你为大家指点迷津呀.
[解决办法]
68楼,那句话的意思是说:C语言会把"数组名"编译成为"指针"后再运行?那是不是所有数组都是这样编译的呢?
[解决办法]

[解决办法]
本来偶也想汇一下的,可惜没有力气了~~
现在越来越懒了,文都不想写,哎~
等到总结结贴后,那个有空的帮忙弄一下~
[解决办法]
《C程序设计语言 第2版》:在计算数组元素a[i]时,C语言实际上先将其转换为*(a+1)的形式,然后再进行求值,因此在程序中这两种形式是等价的。

谢谢68楼的指点了,我再去查了一下,理解了。

读书人网 >C++

热点推荐