210 likes | 266 Views
Learn about pointer manipulation, array operations, passing arrays to functions, dynamic memory allocation, and string handling in C programming.
E N D
More Pointers • Write a program that: • Calls a function to input an integer value • The above function calls another function that will double the input value • Both of the above functions must have void return types • Print out the doubled value in main
Solution int main(void) { double value; inputDataAndDouble(&value); printf(“Your value doubled is %f.”, value); return 0; } void inputDataAndDouble(double *num) { printf(“Enter a number and I will double it: “); scanf(“%lf”, num); /* Why not &num? */ doubleValue(num); /* Why not &num or *num? */ } void doubleValue(double *n) { *n = *n * *n; }
Pointers int main(void) { int *x; int y; int z; y = 10; x = &y; y = 11; *x = 12; z = 15; x = &z; *x = 5; z = 8; printf(“%d %d %d\n”, *x, y, z); return 0; } • What gets printed?
Arrays, and Pointers • Pointer and Array equivalence • Array name is “pointer” to first element in array int x[] = {1,2,3,4,5,6,7,8,9,10}; int *y; y = x; *y = x[3]; *x = y[6]; y[4] = *x; y = &x[4]; *y = x[9]; for (i = 0; i < 10; i++) printf(“%d “, x[i]);
Pointer Arithmetic int x[] = {1,2,3,4,5,6,7,8,9,10}; int *y; y = x + 1; ++y; ++x; /* can’t do */ *y = ++x[3]; *(y+1) = x[5]++; *x = y[6]; y[4] = *x; y = &*(x+4) *y = *(x + 9);
Passing Arrays as Arguments • C passes arrays by reference • the address of the array (i.e., of the first element)is passed to the function • otherwise, would have to copy each element main() { int numbers[MAX_NUMS], size; …size = getValues(numbers); mean = Average(numbers, size); …} int Average(int inputValues[], int size) { … for (index = 0; index < size; index++) sum = sum + indexValues[index]; return (sum / size); }
Arrays of Pointers • char *names[] = {“hello”,”how”,”are”,”you?”}; • What does this look like?
char *names[] = {“hello”,”how”,”are”,”you?”}; • char *word = names[1]; • char **all = names+1; • What are the values of the following? • names[3][1] • **names • *(names[0]+3) • *(++word) • *(*(++all)+1)
Returning arrays from functions • Assume that str is never more than 128 characters • What is wrong with this function? • How can it be fixed? char *copyString(char *str) { char buffer[128]; int index = 0; while ((str[index] != ‘\0’) && (index < 128)) {buffer[index] = str[index]; index++;} return buffer; }
Dynamic Memory Allocation • void *malloc(size_t size) • malloc allocates size number of bytes in memory and returns a pointer to it. The memory is not cleared. • Use: • Use malloc to fix copyString • Make size flexible • What must caller do with return value when done with it? char *line; int *x; line = (char *) malloc (sizof(char) * 80); x = (int *) malloc(sizeof(int));
Dynamic Memory Allocation • void *calloc(size_t nelm, size_t size) • calloc allocates size * nelm number of bytes in memory and returns a pointer to it. Memory is zeroed out. • Use: char *line; int *x; line = (char *) calloc (80, sizof(char)); x = (int *) calloc(1, sizeof(int));
Dynamic Memory Allocation • void *realloc(void *ptr, size_t size) • realloc changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged to the minimum of the old and new sizes; newly allocated memory will be uninitialized. • Use: See Example
Dynamic Memory Allocation • Memory Layout • Activation Record Code Static Data Stack Heap
Dynamic Memory Allocation • void free(void *ptr) • free releases the memory pointed to by ptr. The memory must have been created by malloc or one of its kind. • Use: char *line; line = (char *) calloc (80, sizof(char)); free(line);
Example #include <stdio.h> #include <stdlib.h> #define INCREMENT 80 char *getLine(void); int main(void) { char *line = getLine(); /* no limit to the size of line */ printf("%s\n", line); free(line); return 0; }
char *getLine(void) { char *line, c; int size = sizeof(char) * INCREMENT; int i = 0; line = (char *)malloc(size); while((c = getchar()) != EOF && c != '\n') { line[i] = c; if (i >= size - 2) { size += INCREMENT; line = (char *)realloc(line, size); } i++; } line[i] = '\0'; return line; }
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main() { 5 char **data; /* same as char char *data[] */ 6 int num, i; 7 8 printf("How many items: "); 9 scanf("%d",&num); 10 11 data = (char **) calloc(num, sizeof(char *)); 12 for(i=0; i<num; i++) 13 data[i] = (char *) calloc( 20, sizeof(char)); 14 15 for(i=0; i<num; i++) { 16 printf("Enter item %d: ", i+1); 17 scanf("%s", data[i]); 18 } 19 20 printf("You entered:\n"); 21 for(i=0; i<num; i++) 22 printf("%s ", data[i]); 23 printf("\n"); 24 25 return 0; 26 }
Working With Strings • Write version of strcat • Treating string parameters as arrays • Treating string parameters as pointers
Command Line Arguments • main(int argc, char *argv[]) • So, if your program is invoked as: % a.out one two three • these parameters would • look like:
#include <stdio.h> int main(int argc, char *argv[]) { int i; for ( i = 0; i < argc; i++ ) { printf("%s ", argv[i]); } printf("\n"); return 0; }
#include <stdio.h> int main(int argc, char *argv[]) { while (argc--) printf("%s ", *argv++); printf("\n"); return 0; }