(This page has no text content)
(This page has no text content)
Advance Praise for Head First C “Head First C could quite possibly turn out to be the best C book of all time. I don’t say that lightly. I could easily see this become the standard C textbook for every college C course. Most books on programming follow a fairly predictable course through keywords, control-flow constructs, syntax, operators, data types, subroutines, etc. These can serve as a useful reference, as well as a fairly academic introduction to the language. This book, on the other hand, takes a totally different approach. It teaches you how to be a real C programmer. I wish I had had this book 15 years ago!” — Dave Kitabjian, Director of Software Development, NetCarrier Telecom “Head First C is an accessible, light-hearted introduction to C programming, in the classic Head First style. Pictures, jokes, exercises, and labs take the reader gently but steadily through the fundamentals of C— including arrays, pointers, structs, and functions—before moving into more advanced topics in Posix and Linux system programming, such as processes and threads.” — Vince Milner, software developer
Praise for other Head First books “Kathy and Bert’s Head First Java transforms the printed page into the closest thing to a GUI you’ve ever seen. In a wry, hip manner, the authors make learning Java an engaging ‘what’re they gonna do next?’ experience.” —Warren Keuffel, Software Development Magazine “Beyond the engaging style that drags you forward from know-nothing into exalted Java warrior status, Head First Java covers a huge amount of practical matters that other texts leave as the dreaded ‘exercise for the reader…’ It’s clever, wry, hip, and practical—there aren’t a lot of textbooks that can make that claim and live up to it while also teaching you about object serialization and network launch protocols. ” — Dr. Dan Russell, Director of User Sciences and Experience Research, IBM Almaden Research Center; artificial intelligence instructor, Stanford University “It’s fast, irreverent, fun, and engaging. Be careful—you might actually learn something!” — Ken Arnold, former Senior Engineer at Sun Microsystems; coauthor (with James Gosling, creator of Java), The Java Programming Language “I feel like a thousand pounds of books have just been lifted off of my head.” — Ward Cunningham, inventor of the Wiki and founder of the Hillside Group “Just the right tone for the geeked-out, casual-cool guru coder in all of us. The right reference for practical development strategies—gets my brain going without having to slog through a bunch of tired, stale professor -speak.” — Travis Kalanick, founder of Scour and Red Swoosh; member of the MIT TR100 “There are books you buy, books you keep, books you keep on your desk, and thanks to O’Reilly and the Head First crew, there is the penultimate category, Head First books. They’re the ones that are dog-eared, mangled, and carried everywhere. Head First SQL is at the top of my stack. Heck, even the PDF I have for review is tattered and torn.” — Bill Sawyer, ATG Curriculum Manager, Oracle “This book’s admirable clarity, humor, and substantial doses of clever make it the sort of book that helps even nonprogrammers think well about problem solving.” — Cory Doctorow, coeditor of Boing Boing; author, Down and Out in the Magic Kingdom and Someone Comes to Town, Someone Leaves Town
Praise for other Head First books “I received the book yesterday and started to read it…and I couldn’t stop. This is definitely très ‘cool.’ It is fun, but they cover a lot of ground, and they are right to the point. I’m really impressed.” — Erich Gamma, IBM Distinguished Engineer and coauthor of Design Patterns “One of the funniest and smartest books on software design I’ve ever read.” — Aaron LaBerge, VP Technology, ESPN.com “What used to be a long trial-and-error learning process has now been reduced neatly into an engaging paperback.” — Mike Davidson, CEO, Newsvine, Inc. “Elegant design is at the core of every chapter here, each concept conveyed with equal doses of pragmatism and wit.” — Ken Goldstein, Executive Vice President, Disney Online “I ♥ Head First HTML with CSS & XHTML—it teaches you everything you need to learn in a ‘fun coated’ format.” — Sally Applin, UI designer and artist “Usually when reading through a book or article on design patterns, I’d have to occasionally stick myself in the eye with something just to make sure I was paying attention. Not with this book. Odd as it may sound, this book makes learning about design patterns fun. “While other books on design patterns are saying ‘Bueller…Bueller…Bueller…,’ this book is on the float belting out ‘Shake it up, baby!’” — Eric Wuehler “I literally love this book. In fact, I kissed this book in front of my wife.” — Satish Kumar
Other related books from O’Reilly C in a Nutshell Practical C Programming C Pocket Reference Algorithms with C Secure Programming Cookbook for C and C++ Other books in O’Reilly’s Head First series Head First Programming Head First Rails Head First JavaTM Head First Object-Oriented Analysis and Design (OOA&D) Head First HTML5 Programming Head First HTML with CSS and XHTML Head First Design Patterns Head First Servlets and JSP Head First EJB Head First PMP Head First SQL Head First Software Development Head First JavaScript Head First Ajax Head First Statistics Head First 2D Geometry Head First Algebra Head First PHP & MySQL Head First Mobile Web Head First Web Design
Beijing • Cambridge • Farnham • Kln • Sebastopol • Tokyo Head First C Wouldn’t it be dreamy if there were a book on C that was easier to understand than the space shuttle flight manual? I guess it’s just a fantasy… David Griffiths Dawn Griffiths
Head First C by David Griffiths and Dawn Griffiths Copyright © 2012 David Griffiths and Dawn Griffiths. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly Media books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://my.safaribooksonline.com). For more information, contact our corporate/ institutional sales department: (800) 998-9938 or corporate@oreilly.com. Series Creators: Kathy Sierra, Bert Bates Editor: Brian Sawyer Cover Designer: Karen Montgomery Production Editor: Teresa Elsey Production Services: Rachel Monaghan Indexer: Ellen Troutman Zaig Page Viewers: Mum and Dad, Carl Printing History: April 2012: First Edition. The O’Reilly logo is a registered trademark of O’Reilly Media, Inc. The Head First series designations, Head First C, and related trade dress are trademarks of O’Reilly Media, Inc. Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and O’Reilly Media, Inc., was aware of a trademark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and the authors assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. No kittens were harmed in the making of this book. Really. ISBN: 978-1-449-39991-7 [M] This book uses RepKover™, a durable and flexible lay-flat binding. TM Mum and Dad Carl
To Dennis Ritchie (1941–2011), the father of C.
viii the authors Authors of Head First C David Griffiths David Griffiths began programming at age 12, when he saw a documentary on the work of Seymour Papert. At age 15, he wrote an implementation of Papert’s computer language LOGO. After studying pure mathematics at university, he began writing code for computers and magazine articles for humans. He’s worked as an agile coach, a developer, and a garage attendant, but not in that order. He can write code in over 10 languages and prose in just one, and when not writing, coding, or coaching, he spends much of his spare time traveling with his lovely wife—and coauthor—Dawn. Before writing Head First C, David wrote two other Head First books: Head First Rails and Head First Programming. You can follow David on Twitter at http://twitter.com/dogriffiths. Dawn Griffiths Dawn Griffiths started life as a mathematician at a top UK university, where she was awarded a first-class honors degree in mathematics. She went on to pursue a career in software development and has over 15 years experience working in the IT industry. Before joining forces with David on Head First C, Dawn wrote two other Head First books (Head First Statistics and Head First 2D Geometry) and has also worked on a host of other books in the series. When Dawn’s not working on Head First books, you’ll find her honing her Tai Chi skills, running, making bobbin lace, or cooking. She also enjoys traveling and spending time with her husband, David.
table of contents ix Table of Contents (Summary) Table of Contents (the real thing) Your brain on C. Here you are trying to learn something, while here your brain is, doing you a favor by making sure the learning doesn’t stick. Your brain’s thinking, “Better leave room for more important things, like which wild animals to avoid and whether naked snowboarding is a bad idea.” So how do you trick your brain into thinking that your life depends on knowing C? Intro Who is this book for? xxviii We know what you’re thinking xxix Metacognition xxxi Bend your brain into submission xxxiii Read me xxxiv The technical review team xxxvi Acknowledgments xxxvii Intro xxvii 1 Getting Started with C: Diving in 1 2 Memory and Pointers: What are you pointing at? 41 2.5 Strings: String theory 83 3 Creating Small Tools: Do one thing and do it well 103 4 Using Multiple Source Files: Break it down, build it up 157 C Lab 1: Arduino 207 5 Structs, Unions, and Bitfields: Rolling your own structures 217 6 Data Structures and Dynamic Memory: Building bridges 267 7 Advanced Functions: Turn your functions up to 11 311 8 Static and Dynamic Libraries: Hot-swappable code 351 C Lab 2: OpenCV 389 9 Processes and System Calls: Breaking boundaries 397 10 Interprocess Communication: It’s good to talk 429 11 Sockets and Networking: There’s no place like 127.0.0.1 467 12 Threads: It’s a parallel world 501 C Lab 3: Blasteroids 523 i Leftovers: The top ten things (we didn’t cover) 539 ii C Topics: Revision roundup 553
table of contents x C is a language for small, fast programs 2 But what does a complete C program look like? 5 But how do you run the program? 9 Two types of command 14 Here’s the code so far 15 Card counting? In C? 17 There’s more to booleans than equals… 18 What’s the code like now? 25 Pulling the ol’ switcheroo 26 Sometimes once is not enough… 29 Loops often follow the same structure… 30 You use break to break out… 31 Your C Toolbox 40 Diving in1 getting started with C Want to get inside the computer’s head? Need to write high-performance code for a new game? Program an Arduino? Or use that advanced third-party library in your iPhone app? If so, then C’s here to help. C works at a much lower level than most other languages, so understanding C gives you a much better idea of what’s really going on. C can even help you better understand other languages as well. So dive in and grab your compiler, and you’ll soon get started in no time.
table of contents xi What are you pointing at? If you really want to kick butt with C, you need to understand how C handles memory. The C language gives you a lot more control over how your program uses the computer’s memory. In this chapter, you’ll strip back the covers and see exactly what happens when you read and write variables. You’ll learn how arrays work, how to avoid some nasty memory SNAFUs, and most of all, you’ll see how mastering pointers and memory addressing is key to becoming a kick-ass C programmer. memory and pointers 2 C code includes pointers 42 Digging into memory 43 Set sail with pointers 44 Try passing a pointer to the variable 47 Using memory pointers 48 How do you pass a string to a function? 53 Array variables are like pointers… 54 What the computer thinks when it runs your code 55 But array variables aren’t quite pointers 59 Why arrays really start at 0 61 Why pointers have types 62 Using pointers for data entry 65 Be careful with scanf() 66 fgets() is an alternative to scanf() 67 String literals can never be updated 72 If you’re going to change a string, make a copy 74 Memory memorizer 80 Your C Toolbox 81 31 32 latitude 4,100,000 Set sail for Cancun! Wind in the sails, cap’n! Arr! Spring break!
table of contents xii String theory There’s more to strings than reading them. You’ve seen how strings in C are actually char arrays but what does C allow you to do with them? That’s where string.h comes in. string.h is part of the C Standard Library that’s dedicated to string manipulation. If you want to concatenate strings together, copy one string to another, or compare two strings, the functions in string.h are there to help. In this chapter, you’ll see how to create an array of strings, and then take a close look at how to search within strings using the strstr() function. strings 2.5 Desperately seeking Frank 84 Create an array of arrays 85 Find strings containing the search text 86 Using the strstr() function 89 It’s time for a code review 94 Array of arrays vs. array of pointers 98 Your C Toolbox 101 Compare two strings to each other Search for a string Make a copy of a string Slice a string into little pieces string.h
table of contents xiii Small tools can solve big problems 104 Here’s how the program should work 108 But you’re not using files… 109 You can use redirection 110 Introducing the Standard Error 120 By default, the Standard Error is sent to the display 121 fprintf() prints to a data stream 122 Let’s update the code to use fprintf() 123 Small tools are flexible 128 Don’t change the geo2json tool 129 A different task needs a different tool 130 Connect your input and output with a pipe 131 The bermuda tool 132 But what if you want to output to more than one file? 137 Roll your own data streams 138 There’s more to main() 141 Let the library do the work for you 149 Your C Toolbox 156 Do one thing and do it well3 creating small tools Every operating system includes small tools. Small tools written in C perform specialized small tasks, such as reading and writing files, or filtering data. If you want to perform more complex tasks, you can even link several tools together. But how are these small tools built? In this chapter, you’ll look at the building blocks of creating small tools. You’ll learn how to control command-line options, how to manage streams of information, and redirection, getting tooled up in no time. Standard Input comes from the keyboard. Standard Error goes to the display. Standard Output goes to the display.
table of contents xiv Break it down, build it up If you create a big program, you don’t want a big source file. Can you imagine how difficult and time-consuming a single source file for an enterprise- level program would be to maintain? In this chapter, you’ll learn how C allows you to break your source code into small, manageable chunks and then rebuild them into one huge program. Along the way, you’ll learn a bit more about data type subtleties and get to meet your new best friend: make. using multiple source files 4 Your quick guide to data types 162 Don’t put something big into something small 163 Use casting to put floats into whole numbers 164 Oh no…it’s the out-of-work actors… 168 Let’s see what’s happened to the code 169 Compilers don’t like surprises 171 Split the declaration from the definition 173 Creating your first header file 174 If you have common features… 182 You can split the code into separate files 183 Compilation behind the scenes 184 The shared code needs its own header file 186 It’s not rocket science…or is it? 189 Don’t recompile every file 190 First, compile the source into object files 191 It’s hard to keep track of the files 196 Automate your builds with the make tool 198 How make works 199 Tell make about your code with a makefile 200 Liftoff ! 205 Your C Toolbox 206 gcc -o gcc -c
table of contents xv Ever wished your plants could tell you when they need watering? Well, with an Arduino, they can! In this lab, you’ll build an Arduino-powered plant monitor, all coded in C. C Lab 1 Arduino
table of contents xvi Sometimes you need to hand around a lot of data 218 Cubicle conversation 219 Create your own structured data types with a struct 220 Just give them the fish 221 Read a struct’s fields with the “.” operator 222 Can you put one struct inside another? 227 How do you update a struct? 236 The code is cloning the turtle 238 You need a pointer to the struct 239 (*t).age vs. *t.age 240 Sometimes the same type of thing needs different types of data 246 A union lets you reuse memory space 247 How do you use a union? 248 An enum variable stores a symbol 255 Sometimes you want control at the bit level 261 Bitfields store a custom number of bits 262 Your C Toolbox 266 Rolling your own structures5 structs, unions, and bitfields Most things in life are more complex than a simple number. So far, you’ve looked at the basic data types of the C language, but what if you want to go beyond numbers and pieces of text, and model things in the real world? structs allow you to model real-world complexities by writing your own structures. In this chapter, you’ll learn how to combine the basic data types into structs, and even handle life’s uncertainties with unions. And if you’re after a simple yes or no, bitfields may be just what you need. This is Myrtle… …but her clone is sent to the function. Turtle “t”
table of contents xvii Building bridges Sometimes, a single struct is simply not enough. To model complex data requirements, you often need to link structs together. In this chapter, you’ll see how to use struct pointers to connect custom data types into large, complex data structures. You’ll explore key principles by creating linked lists. You’ll also see how to make your data structures cope with flexible amounts of data by dynamically allocating memory on the heap, and freeing it up when you’re done. And if good housekeeping becomes tricky, you’ll also learn how valgrind can help. data structures and dynamic memory 6 Do you need flexible storage? 268 Linked lists are like chains of data 269 Linked lists allow inserts 270 Create a recursive structure 271 Create islands in C… 272 Inserting values into the list 273 Use the heap for dynamic storage 278 Give the memory back when you’re done 279 Ask for memory with malloc()… 280 Let’s fix the code using the strdup() function 286 Free the memory when you’re done 290 An overview of the SPIES system 300 Software forensics: using valgrind 302 Use valgrind repeatedly to gather more evidence 303 Look at the evidence 304 The fix on trial 307 Your C Toolbox 309 Craggy Isla Nublar Shutter 32 bytes of data at location 4,204,853 on the heap
table of contents xviii Looking for Mr. Right… 312 Pass code to a function 316 You need to tell find() the name of a function 317 Every function name is a pointer to the function… 318 …but there’s no function data type 319 How to create function pointers 320 Get it sorted with the C Standard Library 325 Use function pointers to set the order 326 Automating the Dear John letters 334 Create an array of function pointers 338 Make your functions streeeeeetchy 343 Your C Toolbox 350 Turn your functions up to 117 advanced functions Basic functions are great, but sometimes you need more. So far, you’ve focused on the basics, but what if you need even more power and flexibility to achieve what you want? In this chapter, you’ll see how to up your code’s IQ by passing functions as parameters. You’ll find out how to get things sorted with comparator functions. And finally, you’ll discover how to make your code super stretchy with variadic functions. Testing Machine
Comments 0
Loading comments...
Reply to Comment
Edit Comment