Presentation is loading. Please wait.

Presentation is loading. Please wait.

Data Variable and Pointer Variable Pass by Reference Pointer Arithmetic Passing Array Using Pointers Dynamic Allocation.

Similar presentations


Presentation on theme: "Data Variable and Pointer Variable Pass by Reference Pointer Arithmetic Passing Array Using Pointers Dynamic Allocation."— Presentation transcript:

1 Data Variable and Pointer Variable Pass by Reference Pointer Arithmetic Passing Array Using Pointers Dynamic Allocation

2 Address VS. Value Each memory cell could store some VALUE. Each cell has an ADDRESS associated with it. Note: Dont confuse the address referring to a memory location with the value stored in that location.

3 Pointer Just another C variable whose value is an address of another variable. Points to that other variable.

4 Declaring a pointer Syntax: * ; Examples: int *ptr; char *cp; float *fp; Note: is the type of the data the pointer points to.

5 Declaring a pointer After declaring a pointer: int *ptr; ptr doesnt actually point to anything yet. (null pointer) We can either: make it point to something that already exists allocate room in memory for something new that it will point to

6 Declaring a pointer Declaring a pointer just allocates space to hold the pointer; it does not allocate something to be pointed to. If local variables in C are not initialized, they may contain anything.

7 Operators Associated with Pointers Reference operator (&) Also known as the address operator Read as address of Dereference operator (*) Read as value pointed by

8 Reference Operator (&) The address that locates a variable within memory is what we call a reference to that variable. Example: int andy; int *ted; ted = &andy;

9 Reference Operator (&) Example: andy = 25; fred = andy; ted = &andy;

10 Dereference Operator (*) Using a pointer we can directly access the value stored in the variable which it points to. Example: beth = *ted; /* beth is equal to value pointed by ted */

11 Dereference Operator (*) Differentiate: beth = ted; /* beth equal to ted ( 1776 ) */ beth = *ted; /* beth equal to value pointed by ted ( 25 ) */ Note: Reference and dereference operators have complementary (or opposite) meanings. A variable referenced with & can be dereferenced with *.

12 Pointers Examples: andy = 25; ted = &andy; After these expressions: andy = 25 &andy = 1776 ted = 1776 *ted = 25

13 Pointers 13 Data Variable int x=5; x=5 &x addressdata Pointer Variable int x=5; int *p; p=&x; printf(%p, p); printf(%d, *p); the data inside address p x=5 &x=FF00 p=address (FF00)

14 14 Sample Program : Pointers 1/* Filename: Pointers.c Program Description: Pointer example */ Predict the output: #include main() { int count, value; int *count_address; count = 100; count_address=&count; value= *count_address; printf(\n %p, count_address); printf(\n %d, value); getch(); } Pointers

15 Review: Parameter Passing Two Ways: Pass by Value Pass by Reference

16 Review: Pass by Value int cubeByValue( int ); main() {int n = 5; printf(Original value: %d, n); n = cubeByValue( n ); printf(\nNew value: %d, n); getch(); ) int cubeByValue( int n ) { return n * n * n; }

17 Example 1: Pass by Reference int cubeByReference( int * ); main() {int n = 5; printf(Original value: %d, n); n = cubeByReference( &n ); printf(\nNew value: %d, n); getch(); ) int cubeByReference( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; return *nPtr; }

18 Example 2: Pass by Reference void cubeByReference( int * ); main() {int n = 5; printf(Original value: %d, n); cubeByReference( &n ); printf(\nNew value: %d, n); getch(); } void cubeByReference( int *nPtr ) { *nPtr = *nPtr * *nPtr * *nPtr; }

19 Exercise: Create a function that would swap two numbers. The numbers must be pass as parameters of that function: Using pass by value Using pass by reference

20 Pointer Arithmetic Pointers only have limited set of operations: A pointer could be incremented (++) and decremented (--) An integer may be added (+, +=) to a pointer An integer may be subtracted (-, -=) from a pointer One pointer may be subtracted from another

21 Pointer Arithmetic int v[5]; vPtr can be initialized by: vPtr = v; vPtr = &v[0]; The diagram considers a machine (computer) with 4-byte integers vPtr v[0] v[1] v[2] v[3] v[4]

22 Pointer Arithmetic Example: vPtr += 2; Result: * 4 = vPtr v[0] v[1] v[2] v[3] v[4] vPtr

23 Pointer Arithmetic For arrays of other data types, vPtr would be incremented by twice the number of bytes that it takes to store an object of that data type. Example: char v[5]; vPtr += 2; Result: * 1 = vPtr v[0] v[1] v[2] v[3] v[4] vPtr

24 Pointer Arithmetic Same case of a 2-byte integer machine. Example: int v[5]; vPtr += 2; Result: * 2 = 3004 Most computers have 2-byte or 4-byte integers. Some newer ones uses 8-byte machines. Because of this, pointer arithmetic is machine- dependent vPtr v[0] v[1] v[2] v[3] v[4] vPtr

25 Pointer Arithmetic If these are conducted in sequence: vPtr is incremented to 3016:vPtr += 4; vPtr is set back to address 3000:vPtr -= 4; To increment vPtr:++vPtr; or vPtr++; To decrement vPtr:--vPtr; or vPtr--; 3000 vPtr v[0] v[1] v[2] v[3] v[4]

26 Pointer Arithmetic What would be the value of x? x = v2Ptr – vPtr; Pointer arithmetic is meaningless unless performed on an array vPtr v[0] v[1] v[2] v[3] v[4] v2Ptr

27 Pointer Arithmetic Pointers can be compared using equality and relational operators, but is meaningless unless pointers point to members of the same array. Pointer comparisons compare the addresses stored in the pointers.

28 Generic Pointers A pointer can be assigned to another pointer if both pointers are of the same type. *a = *b; Otherwise, a cast operator must be used to convert the pointer. *a = * (int *) b;

29 Generic Pointers Exception: pointer to void (i.e. void *) Generic pointers can represent any pointer type. A cast operation is not required but we can cast any data variable as a pointer to void. A pointer to void cannot be dereferenced.

30 Example: Generic Pointers main() { int i; char c; void *v; clrscr(); i = 6; c = 'a'; v = &i; printf(v points to %d\n", *(int *) v); v= &c; printf(v now points to %c\n", *(char *) v); getch(); }

31 Pointer Arithmetic VALID: Add an integer to a pointer. Subtract an integer from a pointer. Subtract 2 pointers (from the same array). Compare pointers (, >=). Compare pointer to NULL (indicates that pointer points to nothing). INVALID: Adding 2 pointers. Multiplying pointers. Dividing pointers. Subtracting a pointer from integer. Add or subtract type float or double to or from pointers.

32 Pointer Arithmetic Predict the output: int x[5] = { 1, 2, 3, 4, 5 }; printf(\n %d, *p1 ); int *p1; x[2] = *p1 + p1[2]; p1 = x; printf(\n %d, x[2] ); p1++;

33 Arrays and Pointers Arrays and pointers are closely related An array name is a constant pointer The name of the arrays points to the address/location of the first element of the array. Constant pointer means that its value (address/reference) could not be changed.

34 Using ARRAY INDEXING: Arrays and Pointers v v[0] v[1] v[2] v[3] v[4] int v[5];

35 Using POINTER MANIPULATION: Pointers can also be subscripted (indexed) exactly like arrays can. This is referred to as pointer/subscript notation. Arrays and Pointers int v[5]; int *p = v; p[0] p[1] p[2] p[3] p[4] p

36 Using POINTER MANIPULATION: Using pointer arithmetic, the array could be traversed. Arrays and Pointers int v[5]; int *p = v; p++; p += 3; *p--; p[0] p[1] p[2] p[3] p[4] p

37 Passing Arrays using Pointers Sample Program : Passing Array Using Pointer 1/* Filename: ArrayPtr.c Program Description: Display the string character by character */ Predict the output: #include void Display(char *p); main() { char str[6] = hello; Display( str ); getch(); } void Display( char *p ) { while( *p ) { putchar( *p ); p++; }

38 Double Pointers A pointer whose value is the address of another pointer. Also called as a Pointers to pointers (i.e. pointers to int, pointers to char, etc.) Syntax: int **ptr; char **a;

39 Double Pointers Example: int **ipp; int i = 5, j = 6; k = 7; int *ip1 = &i, *ip2 = &j; ipp = &ip1; 756 i j k 3000 … 4FF1 … … 581C 123D ipp 3000 ip1 123D 4FF1 ip2 54EA POINTER VALUES: *ipp = 3000 **ipp = 5

40 Double Pointers Example: *ipp = ip2; POINTER VALUES: *ipp = 4FF1 **ipp = i j k 3000 … 4FF1 … … 581C 123D ipp 4FF1 ip1 123D 4FF1 ip2 54EA

41 Double Pointers Example: *ipp = &k; POINTER VALUES: *ipp = 581C **ipp = i j k 3000 … 4FF1 … … 581C 123D ipp 581C ip1 123D 4FF1 ip2 54EA

42 Dynamic Memory Allocation Allows to programmers to allocate (reserve) memory dynamically. Obtain more memory space at execution time. Common Library functions associated: malloc() free() sizeof()

43 Dynamic Memory Allocation Sample Program : Dynamic Allocation /* Filename: Dynamic.c Program Description: Using malloc */ Output: #include main() { int *p1,x; int *p[4]; p1=(int *) malloc(sizeof(int)); *p1= 5; printf(\n%d, *p1); p[0] = (int *) malloc( sizeof( int )); p[1] = (int *) malloc( sizeof ( int)); p[2] = (int *) malloc( sizeof( int )); p[3] = (int *) malloc( sizeof( int )); *p[0] = 10; *p[1] = 20; *p[2] = 30; *p[3] = 40; for(x=0; x<4; x++) printf(\n%d, *p[0] ); for(x=0; x<4; x++) free( p[x] ); getch(); }

44 Pointers EXERCISE (By pairs): 1. Make a function that accepts a pointer to a string and determine how many letter As are there in the string. 2. Make a function that accepts an array of n integers and returns the average of these integers. Implement using pointers.

45 NOTES 45 (PCBLab Forum > ComE Subjects > ComE 211)


Download ppt "Data Variable and Pointer Variable Pass by Reference Pointer Arithmetic Passing Array Using Pointers Dynamic Allocation."

Similar presentations


Ads by Google