Download presentation
Presentation is loading. Please wait.
Published byLouisa Allen Modified over 9 years ago
1
C Programming Lecture 14 Instructor: Wen, Chih-Yu Department of Electrical Engineering National Chung Hsing University
2
Pointer Notation vs. Array Notation Topics Use pointer notation to access array elements and strings C allows array data to be accessed using pointer notation as well as array notation.
3
Pointer Notation vs. Array Notation How to use pointer notation to access the elements of a 1-D character array? Using either array or pointer notation Access the element indicated by aa[16] putchar(aa[16]); putchar(*(aa+16));
4
Pointer Notation vs. Array Notation What logic underlies this notation? Involves pointer arithmetic in the form of adding an integer to an address. C performs this type of operation by first noting the type of address. aa + 16 aa is the address of the beginning of a 1-D array of characters. Since characters occupy 1 byte of memory, C adds 16 bytes to the address indicated by aa. Gives us the address of the character indicated by aa[16], the 17th character. Using the unary * operator, the expression *(aa+16) gives us the value of the 17th character.
5
Pointer Notation vs. Array Notation How to use pointer notation to access the elements of a 2- D array? Using either array or pointer notation Access the element indicated by bb[3][5] putchar(bb[3][5]); putchar(*(*(bb+3)+5)); C regards bb[ ][ ] as an array of arrays Five 1-D arrays of size 40 The address expressed as bb is regarded an address of the beginning of one of the rows. An individual element of that address is considered to have a size 40, not 1! When we add bb and 3, we add 3*40 = 120 bytes to the address indicated by bb.
6
Pointer Notation vs. Array Notation *(bb+3) represents the address (not the value, as occurs when working with 1-D arrays or single pointer variables) of the beginning of the forth row. char bb[5][40]={"We can", "use both", "array and pointer", "notation to access", "one and two-dimensional arrays"}; putchar(*(*(bb+3)+5)); causes the character i to be printed. With a 2-D array, need two unary * operators With a 3-D array, need three unary * operators
7
Pointer Notation vs. Array Notation What does *(bb+2) represent? Equivalent to bb[2] Represents the address of the beginning of the third row in the bb[ ][ ] array. puts(*(bb+2)) causes the string “array and pointer” to be printed.
8
Pointer Notation vs. Array Notation With the declaration char *dd, what does dd+125 indicates? The variable dd indicates an address. The 125 causes 125 bytes to be added to the address indicated by dd. dd = &bb[0][0]; putchar(*(dd+125)); Print the character i, which is the 126th character in the bb[ ][ ] array.
9
Pointer Notation vs. Array Notation Can we use dd = bb, instead of dd = &bb[0][0]? No, because C considers it to be a type mismatch. dd is a pointer variable. Cannot take on the characteristics of an array address bb is the address of a 2-D array. Would putchar(*(bb+125)); print the 126th character of the bb[ ][ ] array? No; first, the statement would not compile since two unary * operators are needed to point to a single character. Pointer arithmetic would not advance 125 bytes but 125x40 = 5000 bytes.
10
Pointer Notation vs. Array Notation How to use pointer notation to access the element of a 3-D array? For instance, putchar(cc[1][2][3]); putchar(*(*(*(cc+1)+2)+3)); C regards 3-D arrays as arrays of arrays, cc[2][3][20] is considered two 2-D arrays of size [3][20] The address expressed as cc is regarded an address of the beginning of one of the 2-D arrays
11
Pointer Notation vs. Array Notation *(cc+1) represents the address of the beginning of the second 2-D array. *(cc+1)+2 The address is to the beginning of the next 2-D array using one unary * operator The integer 2 causes the addition of 2*20 = 40 bytes. *(*(cc+1)+2) represents the address of the beginning of the third row of the second 2-D array *(*(*(cc+1)+2)+3) putchar(*(*(*(cc+1)+2)+3)); Print out a single character.
12
Pointer Notation vs. Array Notation How to use putchar with a single unary * operator to print a character from the cc[ ][ ][ ] array? Assign the address of the first character of the cc[ ][ ][ ] array to the single pointer variable, dd. Use a single unary * operator to access individual values of the cc[ ][ ][ ] array. dd = &cc[0][0][0]; putchar(*(dd+80));
13
Pointer Notation vs. Array Notation What do cc, *cc, **cc represent? All three represent the address of the first element of the cc[ ][ ][ ] array. cc+1 = address of first element + 60 bytes *cc+1 = address of first element + 20 bytes **cc+1 = address of first element + 1 byte
14
Pointer Notation
15
Pointer Arithmetic Have the following declarations for 1-D arrays. int aa[50]; float bb[100]; double cc[77]; DeclarationBytes per elementOperationAction int aa[50]2 aa+20Adds 2*20 = 40 bytes float bb[100]4 bb+12Adds 4*12 = 48 bytes double cc[77]8 cc+9Adds 8*9 = 72 bytes
16
Direct Correspondence Pointer notationArray notation *(aa+20)aa[20] *(bb+12)bb[12] *(cc+9)cc[9]
17
/* Program for Lesson 7_9*/ #include void main(void) { char aa[35]={"This is a one-dimensional array"}; char bb[5][40]={"We can","use both","array and pointer", "notation to access","one and two-dimensional arrays"}; char cc[2][3][20]={"A three ","dimensional ","array ","is ","shown ","also"}; char *dd; printf("**************** Section 1 1-D array ****************\n"); putchar(aa[0]); putchar(*aa); putchar('\n'); putchar(aa[16]); putchar(*(aa+16)); putchar ('\n'); printf("**************** Section 2 2-D array ****************\n"); putchar(bb[3 ][5] ); putchar(*(*(bb+3)+5)); putchar('\n');
18
puts(*(bb+2)); dd=&bb[0][0 ]; putchar(*(dd+125)); putchar('\n'); printf("**************** Section 3 3-D array ****************\n"); putchar(cc[1][2 ][3]); putchar(*(*(*(cc+1)+2)+3)); putchar('\n'); puts(*(*(cc+1)+2)); dd=&cc[0][0][0]; putchar(*(dd+80)); putchar('\n'); puts(dd+80); printf("Address of cc[0][0][0]=%p, cc+1=%p, *cc+1=%p, **cc+1=%p\n", &cc[0][0][0],cc+1,*cc+1,**cc+1); }
19
Dynamic Memory Allocation Topics Reserving memory during execution Using calloc, malloc, and realloc Large and small amounts of memory Reserve memory based on the size of problem Illustrate the functions (calloc, malloc, realloc, and free) Utilize dynamic memory features A 1-D character array, aa[19], and a 1-D pointer array, bb[22] A fixed-size 2-D array, cc[22][19] Specify how much memory is to be reserved. calloc() and malloc()
20
The Function calloc( ) What does the function calloc do? The function calloc() reserves memory during program execution. The amount of memory is determined by the arguments passed to calloc(). calloc (number_of_elements, bytes_per_element) The product of the integers number_of_elements and bytes_per_element. calloc (xx, sizeof(char)); causes memory for xx elements of sizeof(char) (which is 1 byte) to be reserved.
21
The Functions calloc( ) and malloc( ) The function calloc() returns the address of the beginning of the first element reserved. bb[0] = (char *) calloc (xx, sizeof(char)); Causes the address of the beginning of the memory reserved to be stored in the first element of the pointer array, bb[ ]. The cast operator (int *) or (double *) can be used with calloc(). What does the function malloc( ) do? The amount of memory reserved is determined by the single argument passed to malloc( ). malloc (number_of_bytes);
22
The Function malloc( ) The amount of memory reserved is equal to number_of_bytes. yy = xx*sizeof(char); malloc (yy); bb[1] = (char *) malloc(yy); Causes the address of the beginning of the memory reserved to be stored in the second element of the pointer array, bb[ ]. The cast operator (int *) or (double *) can be used with malloc().
23
The Function realloc( ) The function realloc( ) modifies the amount of memory previously reserved by a call to either malloc or calloc. realloc (pointer, number_of_bytes); The amount of memory reserved is equal to number_of_bytes. The location of the memory reserved is indicated by pointer. The argument pointer must have been returned by a previous call to either calloc or malloc. realloc(bb[1], yy); Reserve different block of memory bb[1] = (char *) realloc(bb[1], yy);
24
The function free( ) What does the function free( ) do? Cancels the reservation for memory previously made by calloc, malloc, or realloc. free (pointer); Cannot reserve the memory as requested? Return a null pointer. Check the returned null pointer to make sure that memory has been successfully allocated.
25
Conceptual Image of Regions of Memory Where in memory is the space reserved? A region called the stack. A region called the heap. A region called the variables. A region called the instructions.
26
A fixed-size 2-D Array Storage
27
Array Storage Using Dynamic Method
28
Using strlen and calloc to create dynamic storage strcpy (aa, cc[0]); xx = strlen(aa); bb[0] = (char *) calloc (xx, sizeof(char)); strcpy (bb[0], aa); Thus, we have been able to use C’s dynamic memory management capabilities.
29
/* Program for Lesson 7_10*/ #include void main(void) { char aa[19]; char *bb[22]; char cc[22][19]={"Example", " String 1 ", "Words"}; int xx, yy; printf("*********** Section 1 - Using calloc *************\n"); strcpy(aa,cc[0]); xx=strlen(aa); bb[0]=(char *)calloc(xx,sizeof(char)); strcpy(bb[0],aa); puts(bb[0]);
30
printf("*********** Section 2 - Using malloc *************\n"); strcpy(aa,cc[1]) ; xx=strlen(aa); yy=xx*sizeof(char); bb[1]=(char *)malloc(yy) ; strcpy(bb[1],aa); puts(bb[1]) ; printf("*********** Section 3 - Using realloc *************\n"); strcpy(aa,cc[2]); xx=strlen(aa); yy=xx*sizeof(char); bb[1]=(char *)realloc(bb[1],yy); strcpy(bb[1],aa); puts(bb[1]) ; free(bb[1]); }
31
Program Development Methodology Assemble relevant equations and background information. Work a specific example. Decide on the major data structure to be used. Develop an algorithm, structure charts, and data flow diagrams. Write source code.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.