C: Pointers, Arrays, and strings. Department of Computer Science College of Engineering Boise State University. August 25, /36

Similar documents
C: Arrays, and strings. Department of Computer Science College of Engineering Boise State University. September 11, /16

C: Pointers. C: Pointers. Department of Computer Science College of Engineering Boise State University. September 11, /21

Arrays and Pointers. Arrays. Arrays: Example. Arrays: Definition and Access. Arrays Stored in Memory. Initialization. EECS 2031 Fall 2014.

Arrays and Pointers. CSE 2031 Fall November 11, 2013

Pointers (part 1) What are pointers? EECS We have seen pointers before. scanf( %f, &inches );! 25 September 2017

C BOOTCAMP DAY 2. CS3600, Northeastern University. Alan Mislove. Slides adapted from Anandha Gopalan s CS132 course at Univ.

Lecture 04 Introduction to pointers

Arrays and Pointers (part 1)

Dynamic memory allocation (malloc)

Pointers. Pointers. Pointers (cont) CS 217

Multidimension array, array of strings

Other C materials before pointer Common library functions [Appendix of K&R] 2D array, string manipulations. <stdlib.

SYSC 2006 C Winter 2012

Arrays and Pointers (part 1)

CSC209H Lecture 4. Dan Zingaro. January 28, 2015

Quick review pointer basics (KR ch )

Memory, Arrays & Pointers

Array Initialization

by Pearson Education, Inc. All Rights Reserved.

Intermediate Programming, Spring 2017*

Understanding Pointers

Systems Programming and Computer Architecture ( )

Arrays. An array is a collection of several elements of the same type. An array variable is declared as array name[size]

Lectures 5-6: Introduction to C

Computer Programming: Skills & Concepts (CP) Strings

CS113: Lecture 5. Topics: Pointers. Pointers and Activation Records

C strings. (Reek, Ch. 9) 1 CS 3090: Safety Critical Programming in C

Kurt Schmidt. October 30, 2018

Pointers. Pointer References

CSC 2400: Computer Systems. Arrays and Strings in C

Programming. Pointers, Multi-dimensional Arrays and Memory Management

advanced data types (2) typedef. today advanced data types (3) enum. mon 23 sep 2002 defining your own types using typedef

Lectures 5-6: Introduction to C

Aryan College. Fundamental of C Programming. Unit I: Q1. What will be the value of the following expression? (2017) A + 9

8. Characters, Strings and Files

C-LANGUAGE CURRICULAM

Procedural programming with C

C Characters and Strings

mith College Computer Science CSC270 Spring 2016 Circuits and Systems Lecture Notes, Week 11 Dominique Thiébaut

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

Scheme G. Sample Test Paper-I. Course Name : Computer Engineering Group Course Code : CO/CD/CM/CW/IF Semester : Second Subject Tile : Programming in C

CSCE150A. Introduction. Basics. String Library. Substrings. Line Scanning. Sorting. Command Line Arguments. Misc CSCE150A. Introduction.

CSC 2400: Computer Systems. Arrays and Strings in C

Computer Science & Engineering 150A Problem Solving Using Computers. Chapter 9. Strings. Notes. Notes. Notes. Lecture 07 - Strings

ONE DIMENSIONAL ARRAYS

CSE 230 Intermediate Programming in C and C++ Arrays, Pointers and Strings

Computer Science & Engineering 150A Problem Solving Using Computers

20 Dynamic allocation of memory: malloc and calloc

Dynamic memory allocation

Strings(2) CS 201 String. String Constants. Characters. Strings(1) Initializing and Declaring String. Debzani Deb

C++ Programming Chapter 7 Pointers

Advanced Pointer & Data Storage

Pointers and File Handling

Computer Programming. Pointers. Marius Minea. 20 November 2017

Lecture 4: Outline. Arrays. I. Pointers II. III. Pointer arithmetic IV. Strings

Arrays, Strings, & Pointers

B.V. Patel Institute of Business Management, Computer & Information Technology, Uka Tarsadia University

CS 261 Fall Mike Lam, Professor. Structs and I/O

PRINCIPLES OF OPERATING SYSTEMS

211: Computer Architecture Summer 2016

Arrays, Pointers and Memory Management

Lecture 05 Pointers ctd..

Carnegie Mellon. C Boot Camp. September 30, 2018

1 Pointer Concepts. 1.1 Pointer Examples

Contents. A Review of C language. Visual C Visual C++ 6.0

Tutorial 1 C Tutorial: Pointers, Strings, Exec

mith College Computer Science CSC352 Week #7 Spring 2017 Introduction to C Dominique Thiébaut

G52CPP C++ Programming Lecture 3. Dr Jason Atkin

Chapter 14 - Advanced C Topics

Arrays and Pointers. Overview. Arrays Introducing Pointers C-Style Character Strings Multidimensioned Arrays

Week 5 9 April 2018 NWEN 241 More on pointers. Alvin Valera. School of Engineering and Computer Science Victoria University of Wellington

Declaring Pointers. Declaration of pointers <type> *variable <type> *variable = initial-value Examples:

CS 222: Pointers and Manual Memory Management

CS 61c: Great Ideas in Computer Architecture

CS 31: Intro to Systems Pointers and Memory. Martin Gagne Swarthmore College February 16, 2016

Pointers, Dynamic Data, and Reference Types

gcc hello.c a.out Hello, world gcc -o hello hello.c hello Hello, world

CS 107 Lecture 5: Arrays. and Pointers in C. Monday, January 22, Stanford University. Computer Science Department

POINTER AND ARRAY SUNU WIBIRAMA

Multiple Choice Questions ( 1 mark)

by Pearson Education, Inc. All Rights Reserved.

Reading Assignment. Strings. K.N. King Chapter 13. K.N. King Sections 23.4, Supplementary reading. Harbison & Steele Chapter 12, 13, 14

Course organization. Course introduction ( Week 1)

Arrays and Pointers in C. Alan L. Cox

CSCI 171 Chapter Outlines

CS C Primer. Tyler Szepesi. January 16, 2013

Course organization. Course introduction ( Week 1)

Lecture 8 Dynamic Memory Allocation

C mini reference. 5 Binary numbers 12

Grade Distribution. Exam 1 Exam 2. Exams 1 & 2. # of Students. Total: 17. Total: 17. Total: 17

Topics so far. Review. scanf/fscanf. How data is read 1/20/2011. All code handin sare at /afs/andrew/course/15/123/handin

I2204 ImperativeProgramming Semester: 1 Academic Year: 2018/2019 Credits: 5 Dr Antoun Yaacoub

Design and development of embedded systems for the Internet of Things (IoT) Fabio Angeletti Fabrizio Gattuso

High-performance computing and programming Intro to C on Unix/Linux. Uppsala universitet

Jagannath Institute of Management Sciences Lajpat Nagar. BCA II Sem. C Programming

Computer Programming

CYSE 411/AIT681 Secure Software Engineering Topic #12. Secure Coding: Formatted Output

2/9/18. CYSE 411/AIT681 Secure Software Engineering. Readings. Secure Coding. This lecture: String management Pointer Subterfuge

High Performance Programming Programming in C part 1

Using Character Arrays. What is a String? Using Character Arrays. Using Strings Life is simpler with strings. #include <stdio.

Transcription:

Department of Computer Science College of Engineering Boise State University August 25, 2017 1/36

Pointers and Arrays A pointer is a variable that stores the address of another variable. Pointers are similar to reference variables in Java. May be used to produce more compact and efficient code (but can be tricky to understand and debug if not used carefully!) Pointers allow for complex linked data structures (e.g. linked lists, binary trees) Pointers allow for passing function parameters by reference instead of by value. Pointers and arrays are closely related. 2/36

Memory Organization Memory is an array of consecutively addressed cells. Typical size of each cell is 1 byte. A char takes one byte whereas other types use multiple cells depending on their size. 3/36

Memory Organization Example: int a = 7; char b = `b'; 4/36

Pointer Syntax Address operator (&): gives the address in memory of an object. p = &c; // p points to c // ( address of c is assigned to p) Indirection or dereferencing operator (*): Gives access to the object a pointer points to. How to declare a pointer variable? Declare using the type of object the pointer will point to and the * operator. int * pa; // a pointer that points to an int double * pb; // a pointer that points to a double 5/36

Pointers Illustrated (1) int a = 7; char b = `b'; int *pa = &a; // pa points to a 6/36

Pointers Illustrated (2) int a = 7; char b = `b'; int *pa = &a; // pa points to a int c = *pa; // c = 7 7/36

Pointers Example 1 Consider the following declaration int x = 1, y = 2 ; int * ip; // ip is a pointer to an int Now we use the address & and dereferencing * operators: ip = &x; /* ip now points to x */ y = *ip; /* y is now 1 */ *ip = 10; /* x is now 10 */ Note that *ip can be used any place x can be used. Continuing the example: *ip = *ip + 1; /* x is now 11 */ *ip += 1; /* x is now 12 */ ++* ip; /* x is now 13 */ (* ip) ++; /* x is now 14, parentheses required */ See full example at C-examples/pointers-and-arrays/pointers1.c. 8/36

Pointers as Function Arguments /* WRONG! */ void swap ( int x, int y) { int tmp ; tmp = x; x = y; y = tmp ; } /* swap *px and *py */ void swap ( int *px, int * py) { int tmp ; tmp = *px; *px = *py; *py = tmp ; } The function on the left is called as swap(a, b) but doesn t work since C passes arguments to functions by value (same as Java). The one on the right will be called as swap(&a, &b) and works. See full example at C-examples/pointers-and-arrays/swap.c. Demo using the GDB debugger 9/36

Pointers and Arrays The name of an array is a pointer to the element zero of the array. So we can write int a [10]; int *pa = &a [0]; // or int *pa = a; Accessing the ith element of an array, a[i], can be written as *(a + i). Similarly *(pa + i) can be written as pa[i]. Note that pa + i points to the ith object beyond pa (advancing by appropriate number of bytes for the underlying type) Note that the name of an array isn t a variable, so we can t change it s value. So a = pa or a++ aren t legal. 10/36

In Class Exercise int a[10]; int *pa = &a[0]; // or int *pa = a; What happens when we run the following code? pa += 1; for ( i = 0; i < 10; i ++) printf ("%d ", pa[i]); What happens when we run the following code (after the above statements)? pa = a; pa - -; printf ("%d ", *pa); 11/36

1-dimensional Arrays Arrays can be statically declared in C, such as: int A [100]; The space for this array is declared on the stack segment of the memory for the program (if A is a local variable) or in the data segment if A is a global variable. Text 0x00000000 Program Binary Data Global/Static variables Heap Dynamically allocated variables Stack Local variables, function/method arguments 0xFFFFFFFF 12/36

Dynamically Allocating Memory (1) However, dynamically declared arrays are more flexible. These are similar to arrays declared using the new operator in Java. /* Java array declaration */ int n = 100; int [] A = new int [n]; for ( i = 0; i < n; i ++) A[ i] = i; // example initialization The equivalent in C is the standard library call malloc and its variants. int n = 100; int *A = ( int *) malloc ( sizeof ( int ) * n); for ( i = 0; i < n; i ++) A[ i] = i; // example initialization The space allocated by malloc is in the heap segment of the memory for the program. To free the space, use the free() library call. free (A); 13/36

Dynamically Allocating Memory (2) Use malloc() and free() to allocate and free memory dynamically. # include < stdlib.h> void * malloc ( size_t size ); void free ( void * ptr ); void * realloc ( void *ptr, size_t size ); void * calloc ( size_t nmemb, size_t size ); malloc() takes as an argument the number of bytes of memory to allocate. Malloc does not initialize the allocated memory (why?) calloc() allocates and initializes the memory to zero. See man page for realloc(). These functions return a pointer to void. What does that mean? Example: C-examples/pointers-and-arrays/1d-arrays.c 14/36

The void * pointer (1) A void * pointer is a pointer that can contain the address of data without knowing its type. This allows pointers of any type to be assigned to it. This supports generic programming in C (similar to Object class in Java) Normally, we cannot assign a pointer of one type to a pointer to another type. A void * pointer cannot be dereferenced. It must be cast to the proper type of the data it points to before it can be used. Note that malloc() returns the void * pointer as it doesn t know what type of data we intend to store in the allocated memory. Hence, we need to cast the return value from malloc() to the appropriate type. 15/36

Swapping arrays using pointers How to swap two arrays? Here is the naive way. int *A = ( int *) malloc ( sizeof ( int ) * n); int *B = ( int *) malloc ( sizeof ( int ) * n); // initialize A and B ( code not shown here ) for (i = 0; i < n; i ++) { int tmp = A[ i]; A[ i] = B[ i]; B[ i] = tmp ; } Using pointers we can merely swap the values of pointers. int *B = ( int *) malloc ( sizeof ( int ) * n); // initialize A and B ( code not shown here ) int * tmp = A; A = B; B = tmp ; Simpler and far more efficient! Example: C-examples/pointers-and-arrays/array-swap.c 16/36

Address Arithmetic (1) Pointers of the same type can be assigned to each other. Pointers of any type can be assigned to a pointer of type void * as an exception. int x = 101; int *pa = &x; int *pi = pa; double * pd = pa; // ILLEGAL void * pv = pa; The constant zero represents the null pointer, written as the constant NULL (defined in <stdio.h>). Assigning or comparing a pointer to zero is valid. int * pa = NULL ; if(pa == NULL ) { // don 't try to dereference pa. } 17/36

Address Arithmetic (2) Pointers can be compared or subtracted if they point to the members of the same array. Adding/subtracting a pointer and an integer is valid. All other pointer arithmetic is illegal. The C standard implies that we cannot do arithmetic with a void * pointer but most compilers implement it. For the purposes of arithmetic, they treat void * as a char *. For example, incrementing a void * pointer will increment it by one byte. Pointer and address arithmetic is one of the strengths of C. Example: C-examples/pointers-and-arrays/pointer-types.c 18/36

Pointer Exercise Consider the following code: int *A; void * ptr ; A = ( int *) malloc ( sizeof ( int ) * n); ptr = A; Based on the above code, mark all of the following expressions that correctly access the value stored in A[i]. 1. *(A + i) 2. *(ptr + i) 3. *(int *)(ptr + i) 4. *((int *)ptr + i) 5. *(ptr + sizeof(int)*i) 19/36

Two-dimensional Arrays A 2-dimensional array can be statically allocated in C as shown in the following example: int Z [4][10]; This array is laid out in memory in row major order, that is, it is laid out as a 1d array with row 0 first followed by row 1, row 2 and then row 3. Z 0 1 2 3 4 5 6 7 8 9 0 1 2 3 row 0 row 1 row 2 row 3 Row Major Layout Some languages use a column major layout for 2-d arrays, which is column 0, then column 1,..., and finally column 9 in the above example. 20/36

Two-dimensional Arrays A 2-dimensional array can be dynamically allocated in C as shown in the following example: int **X; X = ( int **) malloc (n * sizeof ( int *)); for ( i =0; i<n; i ++) X[i] = ( int *) malloc (n * sizeof ( int )); Now X can be used with the normal array syntax, as below for ( i =0; i<n; i ++) for ( j =0; j<n; j ++) X[i][j] = i; To free the 2-dimensional array, we need to reverse all the calls to malloc(), as shown below: for ( i =0; i<n; i ++) free (X[i]); free (X); See full example at C-examples/pointers-and-arrays/2d-arrays.c 21/36

Layout of a Dynamically Allocated 2d Array int **X 0 1 int 0 1 9... 9 int * 22/36

3-dimensional Arrays In-class exercise.write code to dynamically allocate a 3-dimensional array of characters named X with size p q r (Hint: Mind your p s and q s :-)) In-class exercise. Come up with some application examples that could benefit from a 3-dimensional array Draw a picture of the memory layout for the 3-dimensional array allocated above. Takeaway! Write code to properly free the 3-dimensional array allocated above 23/36

C-style Strings A C-style string is an array of characters terminated by the null character - '\0' (ASCII code = 0). There are four ways to declare a string. Modifiable, fixed size array. Compiler determines size based on string literal (e.g. magma takes 6 chars). Use this if you know the length or value of the string at compile-time. char s0 [] = " magma "; s0 [0] = 'd'; /* legal */ s0 = " magma "; /* illegal */ Pointer to un-named, static, read-only array. char *s1 = " volcano "; s1 [0] = 'm'; /* illegal - read only */ s1 = " lava "; /* legal */ Empty, fixed size array. char s2[ MAXLEN ]; Uninitialized pointer. Use this if you don t know the length of the potential string until run-time. char *s3; /* Some later point in your program... */ s3 = ( char *) malloc ( sizeof ( char ) * ( strlen (s0) + 1)); 24/36

C-style Strings C doesn t provide as a basic type so we use functions to do operations with... The header file is string.h See man page for string for a list of all C string functions. Common string manipulation functions: strlen(), strcat(), strncat(), strcpy(), strncpy(), strcmp(), strncmp(), strtok(), strsep(), strfry() etc. Copying. What is wrong with the following? Read man 3 strcpy. strcpy (dest, src ); /* not safe */ We can solve this using strncpy() strncpy ( dest, src, MAXLEN ); /* safer, but read man page */ Better solution is to allocate correct size, then copy. char * dest = ( char *) malloc ( sizeof ( char )*( strlen ( src ) +1) ); strcpy ( dest, src ); 25/36

String Copy Example /* strcpy ; copy t to s, array version */ void strcpy ( char *s, char * t) { int i =0; while ((s[i] = t[i])!= '\0 ') i ++; } /* strcpy ; copy t to s, pointer version 1 */ void strcpy ( char *s, char * t) { int i =0; while ((* s = *t)!= '\0 '){ s ++; t ++; } } 26/36

String Copy Example (contd.) /* strcpy ; copy t to s, pointer version 2 */ void strcpy ( char *s, char * t) { while ((* s++ = *t ++)!= '\0 ') ; } /* strcpy ; copy t to s, pointer version 3 */ void strcpy ( char *s, char * t) { while ((* s++ = *t ++) ) ; } See page 51 of K&R for why you can use an assignment expression as a boolean. Recommend the use of parentheses around assignment used as a boolean 27/36

String Comparison strcmp(s, t) returns negative, zero or positive if s is lexicographically less, equal or greater than t. The value is obtained by subtracting the characters at the first position where s and t differ. /* strcmp : return <0 if s<t, 0 if s==t, >0 if s>t */ int strcmp ( char *s, char * t) { int i; for ( i = 0; s[ i] == t[ i]; i ++) if (s[i] == '\0 ') return 0; return s[ i] - t[ i]; } 28/36

String Comparison (contd.) The pointer version of strcmp: /* strcmp : return <0 if s<t, 0 if s==t, >0 if s>t */ int strcmp ( char *s, char * t) { for ( ; *s == *t; s++, t ++) if (*s == '\0 ') return 0; return *s - *t; } 29/36

String Examples A String Example: C-examples//-ex1.c A String Tokenizing Example: C-examples//-ex2.c A Better String Tokenizing Example: C-examples//-ex3.c 30/36

Other String Tokenizing Functions Use strsep() in cases where there are empty fields between delimiters that strtok() cannot handle. 31/36

Command line arguments Recommended prototype for the main function: int main ( int argc, char * argv []) or int main ( int argc, char ** argv ) argc C-style are being passed to the main function from argv[0] through argv[argc-1]. The name of the executable is argv[0], the first command line argument is argv[1] and so on. Thus argv is an array of pointers to char. In-class Exercise. Draw the memory layout of the argv array. 32/36

Variable Argument Lists in C (1) C allows a function call to have a variable number of arguments with the variable argument list mechanism. Use ellipsis... to denote a variable number of arguments to the compiler. the ellipsis can only occur at the end of an argument list. Here are some standard function calls that use variable argument lists. int printf ( const char * format,...) ; int scanf ( const char * format,...) ; int execlp ( const char * file, const char * arg,...) ; See man stdarg for documentation on using variable argument lists. In particular, the header file contains a set of macros that define how to step through the argument list. See Section 7.3 in the K&R C book. 33/36

Variable Argument Lists in C (2) Useful macros from stdarg header file. va_list argptr; is used to declare a variable that will refer to each argument in turn. void va_start(va_list argptr, last); must be called once before argptr can be used. last is the name of the last variable before the variable argument list. type va_arg(va_list ap, type); Each call of va_arg returns one argument and steps ap to the next; va_arg uses a type name to determine what type to return and how big a step to take. void va_end(va_list ap); Must be called before program returns. Does whatever cleanup is necessary. It is possible to walk through the variable arguments more than once by calling va_start after va_end. 34/36

Variable Argument Lists Example /* C- examples / varargs /test - varargs.c */ # include <stdio.h> # include <stdarg.h> void strlist ( int n,...) { va_list ap; char *s; va_start (ap, n); while (1) { s = va_arg (ap, char *); printf ("%s\n",s); n - -; if (n==0) break ; } va_end (ap); } int main () { strlist (3, " string1 ", " string2 ", " string3 "); strlist (2, " string1 ", " string3 "); } 35/36

Exercises Reading Assignment: Section 5.1-10. Skim through Sections 5.11 and 5.12 for now. Exercises: 5-3, 5-5, 5-13. 36/36