36
See through C Tushar B Kute http://www.tusharkute.com

See through C

Embed Size (px)

DESCRIPTION

The presentation given at PCCOE, Nigdi, Pune by Prof. Tushar B Kute in workshop on "See through C". http://tusharkute.com

Citation preview

Page 1: See through C

See through C

Tushar B Kutehttp://www.tusharkute.com

Page 2: See through C

Objectives

Be able to use arrays, pointers, and strings in C programs

Be able to explain the representation of these data types at the machine level, including their similarities and differences

http://www.tusharkute.com 2

Page 3: See through C

http://www.tusharkute.com 3

Arrays in C

No bounds checking!Allowed – usually causes no errorarray[10] may overwrite b

Unlike Java, array size in declaration

int array[10];

int b;

array[0] = 3;

array[9] = 4;

array[10] = 5;

array[-1] = 6;

Compare: C: int array[10];

Java: int[] array = new int[10];

All elements of same type – homogenous

First element (index 0)Last element (index size - 1)

Page 4: See through C

http://www.tusharkute.com 4

Array Representation

Homogeneous → Each element same size – s bytes An array of m data values is a sequence of m×s bytes Indexing: 0th value at byte s×0, 1st value at byte s×1, …

m and s are not part of representation Unlike in some other languages s known by compiler – usually irrelevant to programmer m often known by compiler – if not, must be saved by

programmer

a[0]

a[1]

a[2]

0x1000

0x1004

0x1008

int a[3];

Page 5: See through C

http://www.tusharkute.com 5

Array Representation

char c1;int a[3];char c2;int i;

c1

a[0]

a[1]

a[2]

i

0x1000

0x1004

0x1008

0x100C

0x1014

c20x1010

Could be optimized by making these

adjacent, and reducing padding (by default, not)

Array aligned bysize of elements

Page 6: See through C

http://www.tusharkute.com 6

Array Sizes

What is

sizeof(array[3])?

sizeof(array)?

int array[10];

4

40

returns the size of an object in bytes

Page 7: See through C

http://www.tusharkute.com 7

Multi-Dimensional Arrays

int matrix[2][3];

matrix[1][0] = 17;

matrix[0][0]

matrix[0][1]

matrix[0][2]

0x1000

0x1004

0x1008

matrix[1][0]

matrix[1][1]

matrix[1][2]

0x100C

0x1010

0x1014

Recall: no bounds checking

What happens when you write:

matrix[0][3] = 42;

“Row Major”Organization

Page 8: See through C

http://www.tusharkute.com 8

Sample Program

#include<stdio.h>

int main()

{int arr[10], c;

printf(“Enter 10 elements: “);

for(c=0;c<10;c++)scanf(“%d”,&arr[c]);

printf(“Array elements are: “);

for(c=0;c<10;c++)printf(“\n%d”,arr[c]);

}

Page 9: See through C

http://www.tusharkute.com 9

Exercise Programs

Program-1 Write a program to input 10 elements from user

and find addition of all the numbers.

Program-2 Write a program to input 5 numbers from keyboard

and find greatest among all the elements.

Program-3 Write a program input 10 array elements and

separate odd and even numbers from the array.

Page 10: See through C

http://www.tusharkute.com 10

Memory Addresses

Storage cells are typically viewed as being byte-sized

Usually the smallest addressable unit of memory• Few machines can directly address bits individually

Such addresses are sometimes called byte-addresses

Memory is often accessed as words Usually a word is the largest unit of memory

access by a single machine instruction• CLEAR’s word size is 8 bytes (= sizeof(long))

A word-address is simply the byte-address of the word’s first byte

Page 11: See through C

http://www.tusharkute.com 11

Pointers

Why Pointers?

Advantages?

Disadvantages?

Page 12: See through C

http://www.tusharkute.com 12

Pointers

Special case of bounded-size natural numbers Maximum memory limited by processor word-size 232 bytes = 4GB, 264 bytes = 16 exabytes

A pointer is just another kind of value A basic type in C

int *ptr;

The variable “ptr” is a pointer to an “int”.

Page 13: See through C

http://www.tusharkute.com 13

Pointer Operations in C

Creation& variable Returns variable’s memory address

Dereference* pointer Returns contents stored at address

Indirect assignment* pointer = val Stores value at address

Of course, still have...

Assignmentpointer = ptr Stores pointer in another variable

Page 14: See through C

http://www.tusharkute.com 14

Using Pointers

int i1;

int i2;

int *ptr1;

int *ptr2;

i1 = 1;

i2 = 2;

ptr1 = &i1;

ptr2 = ptr1;

*ptr1 = 3;

i2 = *ptr2;

i1:

i2:

ptr1:

0x1000

0x1004

0x1008

ptr2:

0x100C

0x1010

0x1014

1

2

0x1000

0x1000

3

3

Page 15: See through C

http://www.tusharkute.com 15

Using Pointers (cont.)

Type check warning: int_ptr2 is not an int

int1 becomes 8

int int1 = 1036; /* some data to point to */int int2 = 8;

int *int_ptr1 = &int1; /* get addresses of data */int *int_ptr2 = &int2;

*int_ptr1 = int_ptr2;

*int_ptr1 = int2;

What happens?

Page 16: See through C

http://www.tusharkute.com 16

Using Pointers (cont.)

Type check warning: *int_ptr2 is not an int *

Changes int_ptr1 – doesn’t change int1

int int1 = 1036; /* some data to point to */int int2 = 8;

int *int_ptr1 = &int1; /* get addresses of data */int *int_ptr2 = &int2;

int_ptr1 = *int_ptr2;

int_ptr1 = int_ptr2;

What happens?

Page 17: See through C

http://www.tusharkute.com 17

Pointer Arithmetic

pointer + number pointer – number

E.g., pointer + 1 adds 1 something to a pointer

char *p;char a;char b;

p = &a;p += 1;

int *p;int a;int b;

p = &a;p += 1;In each, p now points to b

(Assuming compiler doesn’t reorder variables in memory)

Adds 1*sizeof(char) to the memory address

Adds 1*sizeof(int) to the memory address

Pointer arithmetic should be used cautiously

Page 18: See through C

http://www.tusharkute.com 18

The Simplest Pointer in C

Special constant pointer NULL Points to no data Dereferencing illegal – causes segmentation fault

To define, include <stdlib.h> or <stdio.h>

Page 19: See through C

http://www.tusharkute.com 19

Generic Pointers

void *: a “pointer to anything”

Lose all information about what type of thing is pointed to

Reduces effectiveness of compiler’s type-checking Can’t use pointer arithmetic

void *p;int i;char c;p = &i;p = &c;putchar(*(char *)p);

type cast: tells the compiler to “change” an object’s type (for type checking purposes – does not modify the object in any way)

Dangerous! Sometimes necessary…

Page 20: See through C

http://www.tusharkute.com 20

Pass-by-Reference

voidset_x_and_y(int *x, int *y){ *x = 1001; *y = 1002;}

voidf(void){ int a = 1; int b = 2; set_x_and_y(&a,&b);}

1

2

a

b

x

y

1001

1002

Page 21: See through C

http://www.tusharkute.com 21

Arrays and Pointers

Dirty “secret”:

Array ≈ pointer to the initial (0th) array element

a[i] ≡ *(a+i)

An array is passed to a function as a pointer

The array size is lost!

Usually bad style to interchange arrays and pointers

Avoid pointer arithmetic!

Really int *array

int

foo(int array[],

unsigned int size)

{

… array[size - 1] …

}

int

main(void)

{

int a[10], b[5];

… foo(a, 10)… foo(b, 5) …

}

Must explicitlypass the size

Passing arrays:

Page 22: See through C

http://www.tusharkute.com 22

Arrays and Pointers

int a[]={4,5,1,2,8,9,3,0,7,6};

int *p, i;

p = a; // points first element.

//p = &a[0];

printf("\nArray elements are: \n");

for(i=0;i<10;i++)

{

printf(" %d\n", *p);

p++;

}

Page 23: See through C

http://www.tusharkute.com 23

Passing arrays to functions

Arrays can be passed to the functions as parameters.

In such cases the arrays and pointers are not differentiated.

e.g.int print(int *a, int c)

{

int i;

for(i=0;i<c;i++,a++)

printf("%d\n",*a);

}

Page 24: See through C

http://www.tusharkute.com 24

Returning pointers from functions

Pointer can be the return type of the function.

It is used for returning multiple values from function.

e.g.int * increment(int *a, int c)

{

int i, *p;

p = a;

for(i=0;i<c;i++,a++)

*a = *a + 1;

return p;

}

Page 25: See through C

http://www.tusharkute.com 25

Call by value vs. reference

Call by value Call by reference

The function is called bydirectly passing value ofvariable as argument

The function is called bydirectly passing address ofvariable as argument

We need to declare a generalvariable as function argument

We need to declare a pointervariable as argument.

Calling function by value doesnot changes actual values ofvariables

Calling function by referencechanges actual values ofvariables

It is a slow way of callingfunction as we are calling it bypassing value

It is a fast way of callingfunction as we are calling it bypassing address of a variable

Page 26: See through C

http://www.tusharkute.com 26

Example-2:

int swap1(int x, int y)

{

int t;

t = x;

x = y;

y = t;

}

int swap2(int *x, int *y)

{

int t;

t = *x;

*x = *y;

*y = t;

}

Page 27: See through C

http://www.tusharkute.com 27

File pointers

As file is stored on the disk, it also contains the address.

The FILE is used to store the address of the file.

e.g. FILE *fp;

Page 28: See through C

http://www.tusharkute.com 28

Opening a file

The fopen() function of the stdio.h function is used to open the file.

Syntax:FILE * fopen(char *path, char *mode);

path – path of the file to open.

Mode – mode to open. It may contain values:r – reading mode.w – writing mode.

a – appending mode.

Page 29: See through C

http://www.tusharkute.com 29

Reading from a file

The functions used to read from the file are: int fscanf(FILE *fp, char *format...); int fgetc(FILE *fp);

Example:FILE * fp;

fp = fopen(“file.txt”, “r”);

fscanf(fp, “%s”, str);

ch = fgetc(fp);

Page 30: See through C

http://www.tusharkute.com 30

Writing into a file

The functions used to write in the file are: int fprintf(FILE *fp, char *format...); int fputc(int ch, FILE *fp);

Example:FILE * fp;

fp = fopen(“file.txt”, “w”);

fprintf(fp, “Hello World”);

fputc('a', fp);

Page 31: See through C

http://www.tusharkute.com 31

Exercise

Write a program to open a file which has integer elements stored in it. Count total negative numbers out of these all elements.

Page 32: See through C

http://www.tusharkute.com 32

Strings

In C, strings are just an array of characters Terminated with ‘\0’ character Arrays for bounded-length strings Pointer for constant strings (or unknown length)

char str1[15] = “Hello, world!\n”;char *str2 = “Hello, world!\n”;

H e l l o , w lo r d !\nlength

H e l l o , w lo r d !\nterminator

Pascal, Java, …

C, …

C terminator: ’\0’

Page 33: See through C

http://www.tusharkute.com 33

String length

Must calculate length:

Provided by standard C library: #include <string.h>

int

strlen(char str[])

{

int len = 0;

while (str[len] != ‘\0’)

len++;

return (len);

}

can pass anarray or pointer

Check for terminator

array access to pointer!

What is the size of the array???

Page 34: See through C

Pointer to Pointer (char **argv)

http://www.tusharkute.com 34

Passing arguments to main:

int

main(int argc, char **argv)

{

...

}

an array/vector of char *

Recall when passing an array, a pointer to the first element is passed

size of the argv array/vector

Suppose you run the program this way

UNIX% ./program hello 1 2 3

argc == 5 (five strings on the command line)

Page 35: See through C

http://www.tusharkute.com 35

char **argv

argv[0]

argv[1]

argv[2]

0x1000

0x1008

0x1010

argv[3]

argv[4]

0x1018

0x1020

“./program”

“hello”

“1”

“2”

“3”

These are strings!!Not integers!

Page 36: See through C

http://www.tusharkute.com 36

Thank you