C and C++ programming


Introduction

There are two three new C++ standards:  C++14/C++11. I advise you to get acquainted with them at  https://isocpp.org/ ( ISO C++ Standard )

This text was written back in 2005/2006, and still - loosely - works to introduce  people to C++, although I keep updating it as much as possible it does aim to teach C++ just stimulate you  to overcome the assumption that C++ programming is for a few. I am a living proof that is not.

One good place to bookmark and periodically visit is  Bjarne Stroustrup web site. He may not be as fancy as James Gosling or Steve Jobs, yet he is ten thousand times smarter, important and humble!

Some facts regarding C/C++:


  • The greatest fear to come to novices are "pointers" and next anything that have to do with"pointers".
  • Assembly programmers just learn C easily and fast, at least I have seen it.
  • C++ on the other hand introduces a new paradigm, OOP, and it might be a little harder to grasp it quickly,  but it is not an impossible task. C++ is actually a multipurpose language because it supports many different programming paradigms as generic programming, OOP, old and good procedural programming and meta programming.


The C Language

Before starting, if you could afford a C book I'd recommend that you acquire "The C Programming Language", by Kernighan and Ritchie. Although bearing outdated content ( the last edition of the book came out in 89 ) as the ANSI C standard was last updated in 2011. However, the book is fine.


There is an excellent book that I recommend, which I - used - to take with me anywhere I would go that is "C The Reference Manual 5th Edition" written by Samuel Harbison, which is careful enough to point the differences between all C versions, but I am not sure if it was updated to C11. ( Note I haven't used this book since 2006 ).

If you can only read Portuguese my suggestion is : be sure to check out and read everything at: UFMG C Course . If you can read English, it is probably easier to find free courses. In fact, C is the most used language on Embedded Systems today, although some claim that it would be better to switch to C++. Anyway, for a novice, it is better learning the procedural and structured paradigm first.

( Note I am not sure this course still exists still of today, but I know many people that started learning C from their course ).

C Usefull links:

  • Tom Torfs C Course. Tom Torfs wrote one of the best tutorials on C
    I know. With the advantage of being concise and covering all the language issues in 96 pages, that you can use later. I have  printed out this and let a copy close to me and use it anytime I get in troubles. I think it is the best C reference available on the web but I would not start with this.
  • C code snippets. Very, very usefull code listings that might be used and come at hand for professional jobs

Pointers? If you're afraid of pointers, let me give you a few hints and links. First of all: think of pointers as an arrow pointing to a memory location which is basically what a pointer is.

(When I have troubles with pointers I consult Ted Jensen's tutorial which is very complete)

A pointer is nothing less than a variable that stores an address. You could be wondering why? If you're passing a whole struct to a function and will pass it by value ( i.e. not using pointers ) the compiler will have to copy it all.


For single parameters this is not a trouble, but for huge arrays or huge structs this might be a trouble. With a few experience you start thinking about pointers as addresses and it is less scary with the years.


int i; /*declares a variable of the integer type*/
int *y;/*declares a pointer*/
y = &i;/*y holds the address of the variable*/
int a[10];
y = a; /*you could've made y = &a[0] also */


In fact, the pointer "points" by copying the address of the variable. If you increment a pointer, you just tell the compiler to jump to the next memory  value. If your pointer points to int or float does not matter as it knows where to go. By the way, do never try a "&yourPointer++", because it will cause you major troubles. Either use:


*(yourpointer+1) = 2;

or

yourPointer++;.


Remember that & is the address and * is the content of the pointer. Or & gets the address and * the value we want.


So, go fast to the Ted Jensen's tutorial if you are troubled with pointers. As a matter of fact, he teaches a lot of tips, practical ones, especially if you are dealing with char types ( which is what you usually do when dealing with tcp-ip, serial frames ).


Function pointers are also real hard to get IMHO, and it is generally avoided. However, I had to use it often specially when working with threads and DLLs. In C++, if you want to have a generic function, you just use templates. In C, you cannot use it, so you'll have to use function pointers. Do I need to repeat that you should read the Ted Jensen's tutorial?


Say, you have such a function:


void Ovo( int * )
{
/**/
}

But you want to pass it a function. How to do it?


int function1( int y )
{
/**/
y = y + 20;
return y;
}
int function2( int y )
{
/**/
y = y + 30;
return y;
}


See that both functions have return types and parameters that are compatible to our function pointer. It is then natural to do:



int Ovo( int jaca, int (*functionptr)(int a ) )
{
/*Use functionptr as a shorthand for function1 or function2*/
int inside;
inside = functionptr( jaca );
return inside;
}

int main()
{
int a = Ovo( 2, function1 );
int b = Ovo( 3, function2 );

return 1;
}


The statement below is very complicated. As a matter of fact, I have always a book at my side when using a function pointer:



int Ovo( int jaca, int (*functionptr)(int a ) )/*...*/


Ovo is a function that returns a int. Its parameters are an int value and a function pointer. Or, it gets a function that returns an int and has an int parameter ( check function1 and function2 ). Please note that we use the * operator in the protoype/definition of the function and not when we actually use the function. It's not required.


Anyway, for further and better explanations please check Lars Haendel's tutorial on function pointers.



Another complex subject is dynamic allocation. Not because it's hard to understand, I don't think so, but if do not "deallocate" memory, perhaps you'll be overloading your memory capacities. C has many functions to allocate memory, and the most used is malloc. It allocates N bytes from the heap, but you'll have to cast it to your desired type as it returns a pointer to char. If malloc returns NULL, you didn't get your goal.


#include <stdio.h>
#include <stdlib.h>
struct Example {
unsigned char item1;
int item2;
} ;

typedef struct Example MyStruct;/* always easier to declare a typedef to use
structs */

void GetAStruct( MyStruct * );/*prototype to a function that returns void
and receives a pointer to a struct*/

int main(int argc, char *argv[])
{
MyStruct ms;
MyStruct *mallocateds;
ms.item1 = 'A';
ms.item2 = 'B';
GetAStruct( &ms );

/*does not require the cast, */
mallocateds = malloc( sizeof( MyStruct ) );

if ( mallocateds != NULL )
{
mallocateds->item1 = 0x00;
mallocateds->item2 = 2;
}

free ( mallocateds );
system("PAUSE");
return 0;
}

void GetAStruct( MyStruct * s )
{
/*Do something with the struct you passed to
the function, use the -> operator to access its members */
s->item1 = 0x3A;
s->item2 = 2;

}


The C++ Language 

The transition from C to C++ is not obvious, I think it is fairly clear why. The only method I know to go through this process easily is to write code, laboriously and patiently. 


C++ supports ( among others ) a paradigm called "Object Oriented Programming", which makes use of classes, encapsulation, polymorphism, etc. Again, be sure to use a book or good tutorial that's ANSI C++ compliant otherwise you will find some troubles. 


(By the way Bjarne Stroustrup has a great tip to detect if a tutorial or book is compliant: if the author's main function return void, discard it.)


I highly recommend  http://www.cplusplus.com - which has been also updated to C++11/C++14.


I really recommend the book "Sams Teach your self C++ in 24 hours", this is the book to start learning C++.  The other strong recommendation I have is "Programming Principles And Practices Using C++" by Stroustrup, which is a master piece in the same level of K&R.

After these two, Bjarne Stroustrup's 4th edition of "C++ Programming Language", which is by definition, the greatest and most important C++ canon. But I admit that is not a simply read and it is very expensive. and it works more effectively as a desktop reference ( and to scare Java programmers away ;-) ).

Stroustrup  has also released the excellent "A Tour Of C++" but that is not for novices too albeit rather simpler than the above, it is a very good reading for programmers that want to learn C++ with background in other languages like C or C#. 

I really like Scott Meyers "Effective C++" and "Effective Modern C++", not to read from to cover to cover though.


One of the most powerful features in C++ are templates and STL. There are several data containers that can be used. Programmers need not to worry to implement linked lists or queues. Programmers already have easily at hand several algorithms for searching, sorting etc. The limits of STL these days lie where on how much you know it.


It is ok, of course, if you want to ignore this tip and write your own libraries for this but it will be a waste of time.


The STL strings, usually found under the header <strings>, and usually noted std::strings are very useful. They will save a lot of time and they are faster enough to make you to forget ANSI C NULL terminated strings.


The C++11 and C++14 new features not just make it C++ more appealing but faster and safer. Smart pointers, auto types, lambda functions, move constructors, etc.