需要一些C编程方面的帮助

时间:2010-07-16 19:40:54

标签: c

我是C编程的新手,我在理解C编程中不同库函数的常见缺陷和常见用法时遇到了问题。有人能指出一个很好的资源,在那里我可以学习C编程中的细微之处。也有人可以指点我学习调试工具,比如gdb。

另外,我想知道char *c="hello";char c[10]="hello"之间的区别。有人可以告诉我在不同情况下哪一个推荐给另一个。

谢谢&的问候,

mouseY的。

9 个答案:

答案 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
  • 内存中填充“hello \ 0”
  • 的静态字符串
  • 并将c设置为该静态内存的地址

鉴于:

char c[10] = "hello";

创建:

  • char*名为c (请参阅下面的说明)
  • 内存中的10个插槽
  • 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.16.3)。

在上面的链接中解释过,但只是坚持:指针和数组在C中是不是相同的东西。相反,在某些情况下语言需要指针,但你可以使用而不是数组,它将自动转换。

答案 4 :(得分:0)

答案 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