0% found this document useful (0 votes)
159 views16 pages

Advanced Pointers

This document discusses advanced pointer topics in C, including pointers to functions, callback functions, and jump tables. Pointers to functions allow passing function references as arguments, enabling polymorphism. Callback functions take function pointers as arguments, allowing the caller to specify custom comparison functions for searching linked lists. Jump tables provide an alternative to switch statements by storing function pointers in an array to call the appropriate function. The document also covers command line arguments and how to parse them in C programs.

Uploaded by

Somesh Suman
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
159 views16 pages

Advanced Pointers

This document discusses advanced pointer topics in C, including pointers to functions, callback functions, and jump tables. Pointers to functions allow passing function references as arguments, enabling polymorphism. Callback functions take function pointers as arguments, allowing the caller to specify custom comparison functions for searching linked lists. Jump tables provide an alternative to switch statements by storing function pointers in an array to call the appropriate function. The document also covers command line arguments and how to parse them in C programs.

Uploaded by

Somesh Suman
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 16

Advanced pointer topics

(Reek, Ch. 13)

CS 3090: Safety Critical Programming in C

Pointers to functions

Declaration:
pointer to a function that takes an integer argument and a float argument and returns an integer

returnType (*varName)(parameterTypes);

Examples:

int (*f)(int, float); int *(*g[])(int, float); int *(*g[])(int, float);

pointer to a function that takes an integer argument and a float argument and returns a pointer to an integer An array of pointers to functions Each function takes an integer argument and a float argument and returns a pointer to an integer

CS 3090: Safety Critical Programming in C

Pointers to functions: WHY?

They allow for a certain amount of polymorphism:

poly (many) + morph (shape) A polymorphic language can handle a range of different data types (shapes?) with a single statement

This is common in OO languages like C++, Java:


This method call will result in different sounds, depending on whether myPet holds a Cow object, an Elephant object, etc.

Animal myPet; myPet.makeSound();

CS 3090: Safety Critical Programming in C

Example: searching a singly-linked list


typedef struct IntNode { int value; struct IntNode *next; } INTNODE;
OK, but it only works for nodes containing integer data. If you want a list of strings, youll need to define a new type and new function.

INTNODE *search_list(INTNODE *node, int const key) { while (!node) { if (node->value == key) break; node = node->next; } return node; }

CS 3090: Safety Critical Programming in C

A more abstract notion of node


typedef struct Node { void *value; struct Node *next; } NODE; void* is compatible with any pointer type.
So, this member can hold (a pointer to) any value!

void construct_node(NODE *node, void *value, NODE *next) { node->value = value; node->next = next; } NODE *new_node(void *value, NODE *next) { NODE *node = (NODE *)malloc(sizeof(NODE)); construct_node(node, value, next); return node; }
5 CS 3090: Safety Critical Programming in C

A more abstract notion of search list

What is it that makes the old search_list only work for integers?

The key parameter is of type int The == operator is used to compare int values but == will not work for many types (e.g. structs, strings)

A solution: pass in an additional argument a comparison function!


Programmer must supply a comparison function thats appropriate for the data type being stored in the nodes This function argument is called a callback function:

Caller passes in a pointer to a function Callee then calls back to the caller-supplied function

CS 3090: Safety Critical Programming in C

Abstract search list with callback function


NODE *search_list(NODE *node, void const *key, int (*compare)(void const *, void const *)) { while (node) { if (!compare(node->value, key)) break; node = node->next; } return node; Assumption: compare returns zero if }
its parameter values are equal; nonzero otherwise

CS 3090: Safety Critical Programming in C

Using callback functions

If our nodes hold strings, we have a compare function already defined: strcmp or strncmpy
& is optional here

compiler will implicitly take the address #include <string.h> match = search_list(root, "key", &strcmp);

Note: you may get a warning, since strcmp is not strictly of the right type: its parameters are of type char * rather than void *

CS 3090: Safety Critical Programming in C

Using callback functions

If our nodes hold other kinds of data, we may need to roll our own compare function

int compare_ints(void const *a, void const *b) { const int ia = *(int *)a, ib = *(int *)b; return ia != ib; } match = search_list(root, key, &compare_ints);

CS 3090: Safety Critical Programming in C

Jump tables

In some cases, a nice alternative to long, repetitive switch statements, like this:
add(double, sub(double, mul(double, div(double, double); double); double); double);

double double double double

switch(oper) { case ADD: result case SUB: result case MUL: result case DIV: result }
10

= = = =

add(op1, sub(op1, mul(op1, div(op1,

op2); op2); op2); op2);

break; break; break; break;

CS 3090: Safety Critical Programming in C

Jump tables

Jump table alternative:


add(double, sub(double, mul(double, div(double, double); double); double); double);

double double double double

Array of pointers to functions. Each function takes two doubles and returns a double

double (*oper_func[])(double, double) = { add, sub, mul, div }; result = oper_func[oper](op1, op2);
11 CS 3090: Safety Critical Programming in C

Pointers to functions: safety concerns

What if uninitialized function pointer value is accessed?

Safest outcome: memory error, and program is terminated But what if the garbage value is a valid address?

Worst case: address contains program instruction execution continues, with random results Hard to trace the cause of the erroneous behavior

12

CS 3090: Safety Critical Programming in C

Command line arguments

C programs can be called from the command line, with certain arguments entered along with the program name: e.g. Registration program register You may register with an existing ID by the i option: register -i ID Otherwise, an ID will be generated

13

CS 3090: Safety Critical Programming in C

Command line arguments

main

function can be declared with two arguments:

int main(int argc, char **argv)

holds the number of arguments argv is an array of strings: the nth command line string is stored at argv[n-1]
argc
register -i wallace

3 argc

NUL

argc [0] [1] [2] [3]

14

CS 3090: Safety Critical Programming in C

Implementation of registration program


int main(int argc, char **argv) { char id[ID_LIMIT]; switch(argc) { case 1: generate_ID(id); break; case 3: if (strcmp(argv[1], "-i") exit(INVALID_ARG); strcpy(id, argv[2]); break; default: exit(INVALID_ARG_COUNT); } register(id); }
15 CS 3090: Safety Critical Programming in C

References

The Function Pointer Tutorials. http://www.newty.de/fpt/index.html

16

CS 3090: Safety Critical Programming in C

You might also like