More Pointers

Preview:

DESCRIPTION

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) { - PowerPoint PPT Presentation

Citation preview

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

Solutionint 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

• What gets printed?

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;}

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);

}

16-7

Arrays of Pointers

• char *names[] = {“hello”,”how”,”are”,”you?”};

• What does this look like?

16-8

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;

}

Recommended