需要一些C编程的帮助

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

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

感谢和问候,

像老鼠。

只需阅读C编程语言并编写代码即可。 如果您是新手,那么您需要第一手经验,这样您就可以了解细微之处。 只是阅读一个列表将无济于事。

 char *c = "hello"; 

这使得c成为指针并指向不应修改的内存(因此您无法修改数据)。 但由于c是指针,因此您可以更改指向的位置。

 char c[10] = "hello"; 

这使得c成为一个数组,并安排使用指定的字符串初始化数组。 因为它是一个数组,你可以修改数据(虽然确保你没有溢出缓冲区)但你不能改变内存c引用的位置。

对于语言本身, 语言设计者的书是一本很好的读物。 一定要做练习。

另一个有用的资源是comp.lang.c FAQ 。 你问过问题6.2 (一定要阅读6.1和6.3 )。

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

区别如下:

 char *c = "hello"; 

创造了几件事:

  • char*叫做c
  • 内存中的静态字符串,填充“hello \ 0”
  • 并将c设置为该静态内存的地址

鉴于:

 char c[10] = "hello"; 

创建:

  • 一个名为cchar* (见下面的注释)
  • 内存中有10个插槽
  • c设置为上面第一个位置的地址
  • 它将"hello"视为{'h','e','l','l','o','\0'} ,从而将这些值复制到c[0]c[5]
  • 取决于编译器, "hello"可能会或可能不会在内存中的某个位置分配

注意:

在第二种情况下,从技术上讲,并不是一个数组和一个只包含数组地址的变量,它就像这样。 所以c实际上只是数组中第一个位置地址的别名。 在评论中更新了Tim下面的信息。

对于gdb,文档在线http://sourceware.org/gdb/current/onlinedocs/gdb/

还有一个我觉得更有用的备忘单: http : //users.ece.utexas.edu/~adnan/gdb-refcard.pdf

我的第一个建议是,除非你有充分的理由专门学习C,否则学习C ++。 我意识到这可能会引起一些争议; 如果您还没有这样做,那就要考虑一下。

对于资源,首先一本好书总是最好的,但是如果你正在寻找在线资源,那么你会发现许多与C ++相关,有些涉及C和C ++; 不同风格的写作和演示适合不同的用户; 尝试其中一些:

以下与C ++相关的站点包括对C标准库的出色覆盖:

关于GDB,我赞赏对使用符号调试器的好处的欣赏,有多少开发人员避免使用这个必不可少的工具,但是建议使用原始GDB可能会让你终身使用这些工具。 如果您能够在Windows上使用VC ++,那么它的调试器是首屈一指的,VC ++ Express是免费的。 如果您必须使用GDB(因为您使用的是Linux),我建议您将GDB集成到IDE(如Eclipse或KDevelop)中,或使用独立的Insight调试器。 如果您确实选择直接使用GDB并且直接使用GDB,那么除了GDB手册本身之外,似乎很少有关于如何有效使用它的资源。 还有使用GDB进行调试:GNU源级调试器 ,价格为30美元。

如果你有数学倾向, Project Euler可能会在某些方面给你一些好的练习,特别是在数组操作和东西方面。

但请记住,编程比数学还要多 – 尽管你的教授可能会告诉你。

Andrew Koenig的“C陷阱和陷阱”是一本出色的书,正是为了解C陷阱而准备的。 不过,这本书很精简。 其他人指出的comp.lang.c FAQ也是一个很好的资源。

尝试搜索“c编程谜题”,你会发现很多关于语言本身的棘手细微之处的资源(并且有很多)。 例如。 这里