`
Xiehgjava
  • 浏览: 24624 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于精通C

阅读更多
1)int x=35;
   char str[10];
//问:strlen(str)和sizeof(str)的值分别是多少?

答:strlen(str) 值不确定,strlen根据'\0'确定字符串是否结束。
sizeof(str)=10 sizeof一个数组为数组长度


strcpy(str,"www.it315.org"/*共13个字母*/);
//问:此时x和strlen(str)的值分别是多少?

答:x 为35
    strcpy(char* dest, const char* src)
    根据src来复制dest,依照src的'\0'决定复制的长度,而dest必须要提供足够的长度, 这里会引起溢出,strlen返回13,但是数组外部的数据已经被破坏

   strlen的值为13,在VC++环境下,x的值是要改变的(其他编译器下没试,).虽然表面上看来,在程序中并没有修改x的值,但是实际运行的结果是上面的x的值发生了修改,这是因为strcpy以后,把多余的数据拷贝进了str的邻居(int类型的x)中,所以x的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,



3)char str[10];
str="it315.org";

//编译能通过吗?

答:数组不能赋值,只能初始化。char str[10] = "it315.org";
而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配

4)char *pstr;
   strcpy(pstr,"http://www.it315.org");
//上句编译能通过吗?运行时有问题吗?

答:可以通过编译,但是pstr指向了常量区,运行时最好只做读操作,写操作不保险。

编译可以通过,但是pstr没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误!




const char *p1;
char * const p2;   //const指针必须初始化
//上面两句有什么区别吗?

答:const char* 和 char const* 一样,都是表示指向常量的字符指针。
char * const 表示指向字符的常量指针


p1=(const char *)str;
//如果是p1=str;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?

答:可以通过编译。关于常量与非常量指针的关系是这样的:
   const指针可以指向const或者非const区域,不会造成什么问题。
   非const指针不能指向const区域,会引起错误。(呵呵,这个问题,很经典)


strcpy(p1,"abc");//编译能够通过吗?

答: 不能通过,strcpy( char*, const char*); char* 不能指向const char*

注意:非const指针不能指向const区域,会引起错误。




printf("%d",str);//有问题吗?

答:没有问题,输出的是str的地址信息



Char *pstr;
pstr=3000;//编译能过吗?如果不行,该如何修改以保证编译通过呢?

答:不能通过,char* pstr表示pstr是个字符指针,不能指向3000的整形变量。
修改的话,可以这样:pstr = (char*)3000,把pstr指向3000这个地址;


long y=(long)pstr;//可以这样做吗?

答:可以,y的值为pstr所指的地址。不过如果是纯粹要地址的话,最好是用unsigned long。


int *p=str;
*p=0x00313200;
printf("%s",str);//会是什么效果?提示0x31对应字符'1',0x32对应字符'2'。

答: 首先编译未必会过关,有些编译器可能不允许int * 直接指向char*。最好是改为int *p = (int*)str;
过关了效果就是什么东西都没有。int *p=str; p为str所指的地址,*p表示修改了str所指向的内存。


由于sizeof(int)在32位机上,int有4个字节(其实具体要看编译器的配置文件,好像是limit.h,一般是4个字节)所以修改了str[0]-str[3]
由于0x00313200头尾都是0,所以字符串为'\0'开头,什么都打印不出来。这里有个Big-endin和little-endin的问题。以0x31323334为例
little-endin的机器上面,0x31323334在内存中排列顺序为34 33 32 31,输出为4321,如INTEL芯片的pc
big-endin机器上面为31 32 33 34 ,输出为1234,如IBM POWERPC




p=3000;//p+1的结果会是多少?

答:3000+sizeof(int); 指针+1均为原来地址加上sizeof(指针所指的数据类型)

char *pc=new char[100];//上述语句在内存中占据几个内存块,怎样的布局情况?

答: 本身pc会占用函数栈一个4字节的指针长度(具体是否为4个字节要看机器和编译器)。
new会在堆上申请100个字节sizeof(char)的连续空间。


void test(char **p)
{
       *p=new char[100];
}//这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?

答:该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传入指针的地址。
  原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这   样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。
  可以这样理解,如果传入的参数为int,那么对int本身的值的改变就传不回去啦,加个*也是一样的。


//能明白typedef int (*PFUN)(int x,int y)及其作用吗?
答:定义了一个函数指针类型的宏,这样PFUN就表示指向返回值为int,且同时带2个int  参数的函数指针类型了。
可以用来定义这样的变量:
比如有个函数为int fun( int x, int y );

PFUN p = fun;

补充::函数指针最大的用处在于它可以被一个模板方法调用,这是我在学java的设计模式时领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下所示:
void func1()
{
         //一段流程代码和面向方面的代理,如安全检查,日志记录等
         int sum = add( x , y);
        //一段流程代码和面向方面的代理,如安全检查,日志记录等
}
void func2()
{
         //与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
         int difference = sub( x , y);
        //与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
}
那么,可以只定义一个函数,如下所示
void func(PFUNC p)
{
         //与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
         int difference = p( x , y);
        //与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
}
调用程序在调用时,让参数p分别指向add和sub函数就可以了.

分享到:
评论

相关推荐

    背口决14天精通C语言

    《背口决14天精通C语言》是一本旨在帮助初学者快速掌握C语言编程的教程。C语言作为计算机科学的基础,是许多程序员入门的首选语言。它以其简洁、高效和强大的系统级编程能力而闻名。这本书通过口诀的形式,巧妙地将...

    21天精通c语言pdf.rar

    《21天精通C语言》是一本旨在帮助读者快速掌握C语言编程技能的教程。C语言,作为一种基础且强大的编程语言,广泛应用于系统编程、软件开发、设备驱动编写等多个领域。通过21天的学习计划,本书旨在让读者从零基础到...

    21天精通c语言

    《21天精通C语言》是一本旨在帮助初学者在短时间内高效学习并掌握C语言的教程。C语言作为计算机科学的基础,是许多编程语言的基石,对于理解和开发各种软件系统至关重要。通过21天的学习计划,这本书旨在提供一个...

    C语言从入门到精通

    《C语言从入门到精通》是一本专门为初学者设计的C语言教程,旨在帮助读者从零基础逐步掌握C语言编程技能。C语言是计算机科学的基础,对于理解计算机工作原理和进行系统级编程具有重要意义。这本书深入浅出地介绍了...

    教你半个月内精通C语言

    "教你半个月内精通C语言"的课程旨在帮助初学者快速掌握C语言的核心概念与编程技巧。 课程内容分为多个章节,根据提供的压缩包文件名,我们可以推测其涵盖了C语言的基础到进阶内容: 1. **chap1.ppt - C语言入门** ...

    c语言入门到精通

    c语言入门到精通

    c语言经典4本书 精通c语言必备的书籍

    精通C语言不仅可以帮助你理解计算机底层工作原理,还能为学习其他高级语言打下坚实的基础。以下是对四本C语言经典书籍的详细介绍: 1. **《C程序设计语言》**(The C Programming Language):这本书由C语言的设计...

    精通UNIX下C语言 源码

    《精通UNIX下C语言编程》 书源代码 精通UNIX下C语言精通UNIX下C语言精通UNIX下C语言

    程序员之路──如何学习C语言并精通C语言

    学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你...

    C语言入门到精通.pdf

    C语言入门到精通.pdf 本资源摘要信息将涵盖C语言基础、浮点数表示、图形界面设计等相关知识点。 一、C语言基础 * 浮点数表示:浮点数可以表示为F=S*pow(2,N)式中,F表示浮点数,S表示尾数,N表示阶码。尾数S一般...

    C语言自己独到见解(本人精通c语言对c的一些见解)

    标准C库提供三个标准流:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。I/O接口通过流来操作各种设备,包括文件、通信端口等。当需要对文件进行读写操作时,可以通过标准I/O库的函数,如`fopen`、`...

    C语言从初学到精通

    C语言从初学到精通,PDF电子书,清晰实用

    c语言入门至精通

    c语言入门至精通,学习c语言神器,助你从小白到大神完美过度。

    C语言从入门到精通 (名师精华版).pdf

    C语言从入门到精通 (名师精华版)

    C语言游戏编程从入门到精通

    不过,我依然可以提供关于“C语言游戏编程从入门到精通”的知识点。 C语言游戏编程从入门到精通,一般会包含以下几个方面的知识点: 1. C语言基础知识:学习游戏编程之前,首先要掌握C语言的基本语法,包括数据...

    精通Unix下C语言编程与项目实践

    《精通UNIX下C语言编程与项目实践》从实用的角度出发,深入浅出地对UNIX环境下C语言编程进行全面分析和介绍。《精通UNIX下C语言编程与项目实践》共分为6个部分,详尽而细致地介绍了UNIX环境下的编程概念、文件系统...

    C语言入门至精通(全集).pdf

    C语言入门至精通(全集).pdf适合用于刚学者,上机操作等等

    C语言游戏编程从入门到精通.7z (含光盘代码)

    C语言游戏编程从入门到精通.7z 7-zip压缩文件 包含: C语言游戏编程从入门到精通.pdf 影印版 C语言游戏编程从入门到精通(光盘) 文件夹 DOS下游戏编程的C语言教程,包含图形绘制、中文显示、动画实现、文件调用、...

    精通c语言教程的答案

    《精通 C 程序设计教程》是一本深入学习 C 语言编程的教材,通过解决其中的习题,读者可以巩固并提升 C 语言的基本技能。以下是对标题、描述及部分内容涉及的知识点的详细说明: 1. **基本语法**: - C 语言的变量...

    C语言游戏编程从入门到精通.pdf

    《C语言游戏编程从入门到精通》是一本旨在引导初学者深入理解C语言并掌握游戏编程技巧的专业教材。这本书以PDF格式提供,是学习C语言游戏开发的理想资源。通过本书,读者可以逐步从基础概念开始,发展到创建复杂的...

Global site tag (gtag.js) - Google Analytics