我是C编程的新手,我在理解C编程中不同库函数的常见缺陷和常见用法时遇到了问题。有人能指出一个很好的资源,在那里我可以学习C编程中的细微之处。也有人可以指点我学习调试工具,比如gdb。
另外,我想知道char *c="hello";
和char c[10]="hello"
之间的区别。有人可以告诉我在不同情况下哪一个推荐给另一个。
谢谢&的问候,
mouseY的。
答案 0 :(得分:9)
char *c = "hello";
这使得c
成为指针并指向不应修改的内存(因此您无法修改数据)。但由于c
是指针,因此您可以更改其指向的位置。
char c[10] = "hello";
这使c
成为一个数组,并安排使用指定的字符串初始化数组。由于它是一个数组,你可以修改数据(虽然确保你没有溢出缓冲区),但你不能改变内存c
引用的位置。
答案 1 :(得分:6)
只需阅读The C Programming Language并编写代码即可。如果您是新手,那么您需要第一手经验,这样您就可以了解细微之处。只是阅读一份清单无济于事。
答案 2 :(得分:1)
区别如下:
char *c = "hello";
创造了几件事:
char*
名为c
c
设置为该静态内存的地址鉴于:
char c[10] = "hello";
创建:
char*
名为c
(请参阅下面的说明) c
设置为上述"hello"
视为{'h','e','l','l','o','\0'}
,因此会将这些值复制到c[0]
到c[5]
"hello"
可能会或可能不会在内存中的某个位置分配注意:的
在第二种情况下,从技术上讲,并不是一个数组和一个只包含数组地址的变量,它就像这样。所以c
实际上只是数组中第一个位置地址的别名。在评论中更新了Tim下面的信息。
答案 3 :(得分:1)
对于语言本身,book by the language designers是一个很好的阅读。一定要做练习。
另一个有用的资源是comp.lang.c FAQ。您已经问过question 6.2(请务必阅读6.1和6.3)。
在上面的链接中解释过,但只是坚持:指针和数组在C中是不是相同的东西。相反,在某些情况下语言需要指针,但你可以使用而不是数组,它将自动转换。
答案 4 :(得分:0)
对于gdb,文档在线http://sourceware.org/gdb/current/onlinedocs/gdb/
我觉得更有用的备忘单:http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf
答案 5 :(得分:0)
我的第一个建议是,除非你有充分的理由专门学习C,否则学习C ++。我意识到这可能会引起一些争议;如果您还没有这样做,那就要考虑一下。
对于资源,在第一个例子中,一本好书总是最好的,但是如果你正在寻找在线资源,那么你会发现许多与C ++相关,有些涉及C和C ++;不同风格的写作和演示适合不同的用户;尝试其中一些:
以下与C ++相关的网站包括对C标准库的出色报道:
关于GDB,我赞赏使用符号调试器的好处,很多开发人员都避免使用这个必不可少的工具,但是建议使用原始GDB可能会让你终身使用这些工具。如果你能在Windows上使用VC ++,它的调试器是首屈一指的,VC ++ Express是免费的。如果您必须使用GDB(因为您使用的是Linux),我建议您将GDB集成到IDE(如Eclipse或KDevelop)中,或使用独立的Insight调试器。如果您确实选择直接使用GDB并且直接使用GDB,那么在GDB manual本身之外如何有效地使用GDB的资源似乎很少。 30美元也有Debugging with GDB: The GNU Source-Level Debugger。
答案 6 :(得分:0)
如果你有数学倾向,Project Euler可能会在某些方面给你一些好的练习,特别是在数组操作和东西方面。
但请记住,编程比数学还要多 - 尽管你的教授可能会告诉你。
答案 7 :(得分:0)
Andrew Koenig撰写的“C陷阱和陷阱”是一本出色的书,正是为了解C陷阱。不过,这本书很精简。其他人指出的comp.lang.c常见问题解答也是一个很好的资源。
答案 8 :(得分:0)
尝试搜索“c编程谜题”,你会发现很多关于语言本身的棘手细微之处的资源(并且有很多)。例如。 here