CMPSC 16 Problem Solving with Computers I Spring 2014 Instructor: Tevfik Bultan Lecture 12: Pointers continued, C strings Strings in C • A char array, terminated by '\0' • String literal – anything enclosed in double quotes – e.g., "cat" – automatically includes terminator c a t • Must allocate memory to store the characters char sentence[50]; /* up to 49 chars plus '\0' */ char word[] = "cat"; /* length is 3, but size is 4 */ • Point to such memory with char* (pointer to char) char *s = sentence; s = word; \0 Strings in C • Equivalent declarations of a string char filename[11] = “sensor.txt”; char filename[] = “sensor.txt”; char filename[] = {‘s’, ‘e’, ‘n’, ‘s’, ‘o’, ‘r’, ‘.’, ‘t’, ‘x’, ‘t’, ‘\0’}; Using pointer arithmetic to traverse a string • Example: compute the length of a string by traversing it by incrementing a pointer until reaching the end of the string • The difference between the final value of the pointer and the beginning of the string array will give you the length char *p = word; while (*p++ != '\0') ; /* empty loop moves p to end */ printf("length: %d", p – word - 1); • This is just an example to demonstrate pointer arithmetic, use strlen function in string.h if you want to get the length of a string Copying string t to string s void stringcopy(char *s, char *t) •One way to implement – use subscript notation: int i = 0; while ((s[i] = t[i]) != ‘\0’) i++; •Another way – use the pointer parameters: while ((*s = *t) != ‘\0’) { s++; t++; } •Can just increment in the while header: while ((*s++ = *t++) != ‘\0’); •And it’s possible to be even more cryptic: while (*s++ = *t++); /* works because value of ‘\0’ is 0 */ •These are just examples demonstrating pointer arithmetic, use strcpy function in string.h to copy strings. String library functions • The standard C library contains a number of functions for strings which are defined in string.h: • strlen(t): Returns the length of the string s. • strcopy(s, t): Copies string t to string s and returns a pointer to s. • strcat(s, t): Concatenates string t to the end of string s. • strcmp(s, t): Compares string s to string t in an element-by-element comparison. A negative values is returned if s < t, zero is returned is s is equal to t and a positive value is returned if s > t; Why do we have to deal with pointers? • Given that programming using pointers seems somewhat challenging, why do we need them? • One reason is, as we have seen earlier, pointers allow us to write functions with side-effects, i.e., the changes made in the function body are reflected to the caller – You have to use this carefully since side-effects are hard to understand when someone else looks at your code. • A more significant reason for using pointers is that, without pointers, we would be forced to know the size of each memory we plan to allocate before runtime – We would need to know the sizes of the arrays we plan to allocate for example – But sometimes, the size of an array we plan to allocate may depend on the size of the input. What can we do? Two ways to allocate memory • Static memory allocation – done at compile-time int x; double a[5]; /* allocates space for 1 int, 5 doubles */ – Both size and type are clearly specified ahead of time – x can only hold int values, a only doubles • Dynamic memory allocation – done during execution – Must use library methods like malloc • malloc allocates specific amount of memory, returns void * – Cast to appropriate pointer type – then use as always int *ip = (int *)malloc(sizeof(int)); • Notes: returns NULL if memory not available so must check that; cast is optional – Must free the memory when done with it: free(ip); What is sizeof ? • A unary operator – computes the size, in bytes, of any object or type – Usage: sizeof object or sizeof(type) – If x is an int, sizeof x == sizeof(int) is true • Works for arrays too – total bytes in whole array • Actual type of result is size_t – An unsigned integer defined in <stddef.h> – Similarly, ptrdiff_t is result type of pointer subtraction • Especially useful to find the sizes of data structures The malloc function • malloc is used for dynamic memory allocation • The argument of the malloc function is the number of bytes of memory required (where each byte is 8 bits). • For example, if we want to allocate a memory for 10 integers, we need to figure out how many bytes we need per integer and then multiple that by 10. – We can use sizeof(int)to get the number of bytes used per integer value • Note that this value is system dependent • If there is not enough memory for allocation, then malloc returns NULL • calloc : like malloc but initializes the allocated memory to 0 • realloc : can be used to change the size of the Pointers to functions • Functions are also stored in memory too – A function’s name “points” to its address • Awkward declarations of function pointers – e.g., int (*func)(int, int) declares func as a pointer to a function that takes two ints and returns an int – Like all pointers, especially useful as function parameters (in other functions) • See …/demos/funcptr.c Pointer tutorial Pointer fun http://www.cs.ucsb.edu/~mikec/cs16/slides/binky.html Topics we have discussed after the first midterm • Generating “random” values • File IO • Functions – Parameter passing – Scope, global vs. local variables – Recursive functions • Arrays – Sorting an array – Multi-dimensional arrays – Arrays as function parameters • Software life-cycle, testing, assertions • Pointers – Address and dereference operators – Pointers and arrays – C strings – dynamic memory allocation Practice problems Match the following •black-box testing •assertion •driver to the following phrases •A Boolean expression that is expected to hold at a particular program point •A piece of code that provides the necessary inputs to the module under test •A testing method that is synonymous to functional testing Practice Problems • Given the following piece of code int *a, *b; a = (int *)malloc(sizeof(int)); b = (int *)malloc(sizeof(int)); *a = 5; *b = 17; printf("Values: %d, %d\n", *a, *b); printf("Values: %u, %u\n", a, b); • What will be printed ? • What will be printed if we put the assignment a = b; before the print statements? • How can you swap the values stored at a and b ? • What would happen if we tried this: b = 17; ? Practice problems • What does the following function do? void switch(int a, int b) { int hold; hold = a; a = b; b = hold; return; } Practice problems • Write a function that computes the sum of elements in an array • Write a recursive function that computes the sum of elements in an array Practice problems • The practice problems and problems in your text book!