需要一些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";
创建:
- 一个名为
c
的char*
(见下面的注释) - 内存中有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 ++; 不同风格的写作和演示适合不同的用户; 尝试其中一些:
- http://www.cprogramming.com/
- http://www.howstuffworks.com/c.htm
- http://www2.its.strath.ac.uk/courses/c/
- C书(在线)
- C书(HTML下载)
- C书(PDF)
以下与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编程谜题”,你会发现很多关于语言本身的棘手细微之处的资源(并且有很多)。 例如。 这里