ACS 140 Programming Guide - RS ComponentsSee also parameter 3001 AI
CNG 140 C Programming (Lecture set 10)
description
Transcript of CNG 140 C Programming (Lecture set 10)
![Page 1: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/1.jpg)
CNG 140C Programming(Lecture set 10)
Spring 2006-2007http://www.ceng.metu.edu.tr/~bozyigit/cng140
Chapter 11Arrays, Addresses, and Pointers
![Page 2: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/2.jpg)
CNG140 C programming 2
Objectives
• Array Names as Pointers
• Manipulating Pointers
• Passing and Using Array Addresses
• Processing Strings Using Pointers
• Creating Strings Using Pointers
• Common Programming and Compiler Errors
![Page 3: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/3.jpg)
CNG140 C programming 3
Array Names as Pointers
![Page 4: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/4.jpg)
CNG140 C programming 4
Array Names as Pointers (continued)
![Page 5: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/5.jpg)
CNG140 C programming 5
Example: output elements of an integer array
![Page 6: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/6.jpg)
CNG140 C programming 6
Array Names as Pointers: let gPtr be a pointer type declared as int *gPnt
gPnt=&grade[0];
![Page 7: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/7.jpg)
CNG140 C programming 7
Array Names as Pointers:4th element of array is pointed by gPtr+3
![Page 8: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/8.jpg)
CNG140 C programming 8
Array Names as Pointers (continued)
![Page 9: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/9.jpg)
CNG140 C programming 9
Array Names as Pointers: 4 bytes are sufficient for pointer type variable
![Page 10: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/10.jpg)
CNG140 C programming 10
Array Names as Pointers (continued)
Parentheses are necessary
![Page 11: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/11.jpg)
CNG140 C programming 11
Array Names as Pointers (continued)
• When an array is created, the compiler automatically creates an internal pointer constant for it and stores the base address of the array in this pointer
![Page 12: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/12.jpg)
CNG140 C programming 12
Array Names as Pointers:compiler defined pointer constant for arrays
![Page 13: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/13.jpg)
CNG140 C programming 13
Example:Array Names as Pointers
![Page 14: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/14.jpg)
CNG140 C programming 14
Array Names as Pointers
• In most respects an array name and a pointer can be used interchangeably
• An array name is a pointer constant– grade = &grade[2]; is invalid
• A pointer access can always be replaced using subscript notation– numPtr[i] is valid even if numPtr is a pointer
variable• Pointers are more efficient than using subscripts for
array processing because the internal conversion from subscripts to addresses is avoided
![Page 15: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/15.jpg)
CNG140 C programming 15
Manipulating Pointers
• A pointer, constructed either as a variable or function parameter, contains a value: an address
• By adding numbers to and subtracting numbers from pointers, we can obtain different addresses
• The addresses in pointers can be compared using any of the relational operators (==, !=, <, >, etc.)
• Pointers can be initialized when they are declared
![Page 16: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/16.jpg)
CNG140 C programming 16
Pointer Arithmetic
int nums[100];int *nPtr;
nPtr = &nums[0];nPtr = nums;
![Page 17: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/17.jpg)
CNG140 C programming 17
Pointer Arithmetic: scaled increment according to the type
![Page 18: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/18.jpg)
CNG140 C programming 18
Example: Pointer Arithmetic: for loop
Can be replaced with total += *nPtr++
![Page 19: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/19.jpg)
CNG140 C programming 19
Example:Pointer Arithmetic, while loop
![Page 20: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/20.jpg)
CNG140 C programming 20
Pointer Initialization
• Pointers can be initialized when they are declared:– int *ptNum = &miles; /* miles has been
previously declared */
– double *zing = &prices[0];– double *zing = prices;
![Page 21: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/21.jpg)
CNG140 C programming 21
Passing and Using Array Addresses
![Page 22: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/22.jpg)
CNG140 C programming 22
Can be replaced with findMax(int *vals, int numEls)
Note: vals is a pointer parameter; thus, its address can be modified (but nums’ address in main(), cannot).
Calling findMax(&nums[2], 3) would be valid too
Example: Passing and Using Array Addresses
![Page 23: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/23.jpg)
CNG140 C programming 23
Example: Passing and Using Array Addresses: using pointer type var
• findMax() can be rewritten as:1 int findMax(int *vals, int numEls)2 /* vals declared as a pointer */3 {4 int i, max;5 max = *vals++;67 for (i = 1; i < numEls; i++, vals++)8 if (max < *vals)9 max = *vals;1011 return(max);12 }
![Page 24: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/24.jpg)
CNG140 C programming 24
Passing and Using Array Addresses (continued)
![Page 25: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/25.jpg)
CNG140 C programming 25
Advanced Pointer:
Reading Assignment
![Page 26: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/26.jpg)
CNG140 C programming 26
Advanced Pointer Notation
#define ROWS 2
#define COLS 3
int nums[ROWS][COLS] = { {16,18,20},
{25,26,27} };
![Page 27: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/27.jpg)
CNG140 C programming 27
Advanced Pointer Notation (continued)
![Page 28: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/28.jpg)
CNG140 C programming 28
Advanced Pointer Notation (continued)
• A function that receives an integer two-dimensional array can be declared as:– calc(int pt[2][3])– calc(int pt[][3])– calc(int (*pt)[3])
• It refers to a single pointer of objects of three integers
• The following declaration would be wrong:– calc(int *pt[3])
• It refers to an array of three pointers, each one pointing to a single integer
![Page 29: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/29.jpg)
CNG140 C programming 29
Advanced Pointer Notation (continued)
• Once the correct declaration for pt is made (any of the three valid declarations), the following notations within the function calc() are all equivalent:
![Page 30: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/30.jpg)
CNG140 C programming 30
Advanced Pointer Notation (continued)
• A function can return a pointer– int *calc()
• Pointers to functions are possible because function names, like array names, are themselves pointer constants– int (*calc)()
• Declares calc to be a pointer to a function that returns an integer
• If, for example, sum() returns an integer, the assignment calc = sum; is valid
![Page 31: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/31.jpg)
CNG140 C programming 31
Processing Strings Using Pointers
void strcopy(char string1[], char string2[]){ int i = 0; while (string1[i] = string2[i]) i++;}
void strcopy(char *string1, char *string2){ while (*string1 = *string2) { string1++; string2++; } return;}
while (*string1++ = *string2++);
![Page 32: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/32.jpg)
CNG140 C programming 32
Creating Strings Using Pointers
• The definition of a string automatically involves a pointer (a pointer constant)– char message1[81]; reserves storage for 81
characters and automatically creates a pointer constant, message1, that contains the address of message1[0]
• It is also possible to create a string using a pointer– char *message2;– Now, assignment statements, such as message2 = "this is a string";, can be made
• Strings cannot be copied using an assignment operator
![Page 33: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/33.jpg)
CNG140 C programming 33
Creating Strings Using Pointers (continued)
![Page 34: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/34.jpg)
CNG140 C programming 34
Creating Strings Using Pointers (continued)
Does not overwrite the first string
![Page 35: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/35.jpg)
CNG140 C programming 35
Creating Strings Using Pointers (continued)
![Page 36: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/36.jpg)
CNG140 C programming 36
Allocating Space for a String
• The following declaration is valid:– char *message = "abcdef";
• In case of copying one string to the other, they must be defined properly, with sufficient space: for example, the following program code is not valid:– char *message; /* declaration for a pointer */– strcpy(message,"abcdef"); /* INVALID copy */
– The strcpy is invalid here because the declaration of the pointer only reserves sufficient space for one value—an address
![Page 37: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/37.jpg)
CNG140 C programming 37
Pointer Arrays
• Example:char *seasons[4];
seasons[0] = "Winter";
seasons[1] = "Spring";
seasons[2] = "Summer";
seasons[3] = "Fall";
• Or:char *seasons[4] = {"Winter",
"Spring",
"Summer",
"Fall"};
![Page 38: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/38.jpg)
CNG140 C programming 38
Pointer Arrays (continued)
![Page 39: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/39.jpg)
CNG140 C programming 39
Pointer Arrays (continued)
![Page 40: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/40.jpg)
CNG140 C programming 40
Pointer Arrays (continued)
![Page 41: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/41.jpg)
CNG140 C programming 41
Common Programming Errors
• Using a pointer to reference nonexistent array elements
• Incorrectly applying the address and indirection operators
• Addresses of pointer constants cannot be taken
• Not providing sufficient space for the end-of-string NULL character when a string is defined as an array of characters, and not including the \0 NULL character when the array is initialized
![Page 42: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/42.jpg)
CNG140 C programming 42
Common Programming Errors (continued)
• Misunderstanding the terminology– For example, if text is defined as
char *text;
– it is sometimes referred to as a string
• Becoming confused about whether a variable contains an address or is an address– Pointer variables and pointer arguments contain
addresses– The address of a pointer constant cannot be taken– The address “contained in” the pointer constant
cannot be altered
![Page 43: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/43.jpg)
CNG140 C programming 43
Common Compiler Errors
![Page 44: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/44.jpg)
CNG140 C programming 44
Summary
• An array name is a pointer constant
• Any access to an array element using subscript notation can always be replaced using pointer notation
• Arrays are passed to functions by address, not by value
• When a single-dimensional array is passed to a function, the parameter declaration for the array can be either an array declaration or a pointer declaration
![Page 45: CNG 140 C Programming (Lecture set 10)](https://reader036.fdocuments.in/reader036/viewer/2022062322/568148a1550346895db5b5b5/html5/thumbnails/45.jpg)
CNG140 C programming 45
Summary (continued)
• In place of subscripts, pointer notation and pointer arithmetic are especially useful for manipulating string elements
• String storage can be created by declaring an array of characters or a pointer to be a character
• Pointers can be incremented, decremented, and compared