Presentation is loading. Please wait.

Presentation is loading. Please wait.

C programming or Fun with pointers Tutorial #2 CPSC 261.

Similar presentations


Presentation on theme: "C programming or Fun with pointers Tutorial #2 CPSC 261."— Presentation transcript:

1 C programming or Fun with pointers Tutorial #2 CPSC 261

2 Memory of a C program What does a C program need memory for? – Code – Static data – Dynamic data (heap) – Dynamic data (stack) – Libraries (dynamically linked)

3 Memory of a C program How is this memory laid out?

4 A simple memory model Memory manipulated by a C program is just a bunch of bytes They start at some address (0?) And end at some other address (2^64 - 1?)...

5 Char pointers Variables with type char * fit this model nicely char *p; p = (char *) 0; 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

6 Char pointers Using the pointer accesses one byte char *p; p = (char *) 0; *p = 23; 23 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

7 Char pointers Incrementing the pointer works char *p; p = (char *) 0; p++; 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

8 Other pointers Other pointer types don’t fit quite so nicely int *p; p = (int *) 0; How big is *p ? 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

9 Other pointers Incrementing the pointer int *p; p = (int *) 0; p++; 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

10 Pointer rules The value in a pointer is the smallest address of all the bytes accessed through the pointer int *p = (int *) 0; The bytes accessed are 0, 1, 2, and 3 (ints are 4 bytes) long *p = (long *) 0; The bytes accessed are 0, 1, 2, 3, 4, 5, 6, and 7 (longs are 8 bytes)

11 Other pointers Using the pointer – first try int *p; p = (int *) 0; *p = 23; 0 0 0 0 0 0 23 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

12 Other pointers Using the pointer – second try int *p; p = (int *) 0; *p = 23; 23 0 0 0 0 0 0 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

13 Which one is right? 23 0 0 0 0 0 0 0 0 1 1 2 2 3 3 4 4 5 5 6 6... 0 0 0 0 0 0 23 0 0 1 1 2 2 3 3 4 4 5 5 6 6...

14 Unfortunately, both!! Endian-ness – In a little-endian computer, the least-significant byte of a multi-byte quantity is stored in the byte with the smallest address – In a big-endian computer, the most-significant byte of a multi-byte quantity is stored in the byte with the smallest address

15 Other pointers Using the pointer – big-endian int *p; p = (int *) 0; *p = 23; 0 0 0 0 0 0 23 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

16 Other pointers Using the pointer – little-endian int *p; p = (int *) 0; *p = 23; 23 0 0 0 0 0 0 0 0 1 1 2 2 3 3 4 4 5 5 6 6 p...

17 X86 (and X86_64) is little-endian The “standard” order for data communicated between computers is big-endian (also called “network byte order”)

18 How to swap bytes? Go from one endianness to the other? 23 45 19 66 0 0 1 1 2 2 3 3 19 45 23 0 0 1 1 2 2 3 3

19 Reading data For character data: int *p =...; // Some valid initialization fscanf(f, “%d”, p); For binary data fread(p, sizeof(int), 1, f);

20 How many bytes get read? fscanf(f, “%d”, p); 1 or more byte depending on the input 5 23 2123123123 fread(p, sizeof(int), 1, f); Always 4 bytes, why?

21 Writing data For character data: int *p =...; // Some valid initialization fprintf(f, “%d”, *p); // Note the * For binary data fwrite(p, sizeof(int), 1, f);

22 How many bytes get written? fprintf(f, “%d”, *p); 1 or more bytes depending on the value of *p 5 23 2123123123 fwrite(p, sizeof(int), 1, f); Always 4 bytes, why?


Download ppt "C programming or Fun with pointers Tutorial #2 CPSC 261."

Similar presentations


Ads by Google