C Programming
Download
Report
Transcript C Programming
C Programming
Lecture 14
Instructor: Wen, Chih-Yu
Department of Electrical Engineering
National Chung Hsing University
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.
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));
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.
Pointer Notation vs. Array Notation
How to use pointer notation to access the elements of a 2D 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.
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
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.
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.
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.
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
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.
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));
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
Pointer Notation
Pointer Arithmetic
Have the following declarations for 1-D arrays.
int aa[50];
float bb[100];
double cc[77];
Declaration
Bytes per element
Operation
Action
int aa[50]
2
aa+20
Adds 2*20 = 40 bytes
float bb[100]
4
bb+12
Adds 4*12 = 48 bytes
double cc[77]
8
cc+9
Adds 8*9 = 72 bytes
Direct Correspondence
Pointer notation
Array notation
*(aa+20)
aa[20]
*(bb+12)
bb[12]
*(cc+9)
cc[9]
/* Program for Lesson 7_9*/
#include <stdio.h>
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');
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);
}
Dynamic Memory Allocation
Topics
Reserving memory during execution
Using calloc, malloc, and realloc
Large and small amounts of memory
Illustrate the functions (calloc, malloc, realloc, and free)
Utilize dynamic memory features
Reserve memory based on the size of problem
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()
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.
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);
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().
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);
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.
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.
A fixed-size 2-D Array Storage
Array Storage Using Dynamic Method
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.
/* Program for Lesson 7_10*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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]);
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]);
}
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.