what does this c code do? - github pages · pointers, the spiral rule, and structs how to read c...

21
Pointers and structs

Upload: others

Post on 27-Jun-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Pointers and structs

Page 2: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

What does this C code do?

int foo(char *s) {int L = 0;while (*s++) {

++L;}return L;

}

Page 3: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Pointers, the Spiral Rule, and StructsHow to read C type declarations

C Strings ASCII and null-termination

Array Indexing vs. Pointers Pointer arithmetic, in particular

Structs Non-homogenous arrays Padding

Page 4: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Strings like “Harry Potter” in C are terminated by the null character (0)

72 97 114 114 121 32 80 111 116 116 101 114 0H a r r y P o t t e r \0

32 space 48 0 64 @ 80 P 96 ` 112 p33 ! 49 1 65 A 81 Q 97 a 113 q34 ” 50 2 66 B 82 R 98 b 114 r35 # 51 3 67 C 83 S 99 c 115 s36 $ 52 4 68 D 84 T 100 d 116 t37 % 53 5 69 E 85 U 101 e 117 u38 & 54 6 70 F 86 V 102 f 118 v39 ’ 55 7 71 G 87 W 103 g 119 w40 ( 56 8 72 H 88 X 104 h 120 x41 ) 57 9 73 I 89 Y 105 I 121 y42 * 58 : 74 J 90 Z 106 j 122 z43 + 59 ; 75 K 91 [ 107 k 123 {44 , 60 < 76 L 92 \ 108 l 124 |45 - 61 = 77 M 93 ] 109 m 125 }46 . 62 > 78 N 94 ^ 110 n 126 ~47 / 63 ? 79 O 95 _ 111 o 127 del

Page 5: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Convert the C code into MIPS assembly

int strlen(char *string) {int len = 0;while (string[len] != 0) {len ++;

}return len;

}

Page 6: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Assembly coding can help you gain a better understanding of pointers

int strlen(char *string) {int len = 0;while (string[len] != 0) {len ++;

}return len;

}

int strlen(char *string) {int len = 0;while (*string != 0) {string ++;len ++;

}return len;

}

Page 7: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

A pointer is an address, dereferencing a pointer is a load or store operation

0x00004000 'c'

0x00004001 'h'

0x00004002 'a'

0x00004003 'r'

0x00004004 0xFF

0x00004005 0xFF

0x00004006 0xFF

0x00004007 0xF9

char *char2 = 0x4001

char *char1 = 0x4001

int *x = 0x4004

*char1

*x}lb or lbu

lw

Page 8: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Opcode to use depends on pointer type and usage Use load/store byte (lb/sb) for char *Use load/store half (lh/sh) for short *Use load/store word (lw/sw) for int *Use load single precision floating point (l.s/s.s) for float *

Load: If you need to de-reference pointer to evaluate expression: … = … + *p + … or A[*p]

Store: If the dereference is the direct target of assignment : *p = …

Page 9: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Incrementing a pointer makes it point to the next element of the data type being pointed to

pointer = pointer + sizeof(pointer’s type) 1 for char *, 4 for int *, 4 for float *, 8 for

double *

0x00004000 'c'

0x00004001 'h'

0x00004002 'a'

0x00004003 'r'

0x00004004 0xFF

0x00004005 0xFF

0x00004006 0xFF

0x00004007 0xF9

0x00004008 0x00

0x00004009 0x00

0x0000400A 0x00

0x0000400B 0x09

char string[4] = {'c','h','a','r'};int array[2] = {-7, 9};char *cp = string;int *ip = array;

cp

ip

Page 10: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Convert the C code to MIPS assembly to understand what is going onint strlen(char *string) {int len = 0;

while (*string != 0) {string ++;len ++;

}

return len;}

Page 11: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Compilers/assemblers insert padding to “naturally align” data in structs Structs are like arrays, but the elements can be different types. Same with objects

struct st {int a;char b;short c[4];char *d;

}

0 4 6 8 10 12 14 16a b c[0] c[1] c[2] c[3] d

Page 12: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Compilers/assemblers insert padding to “naturally align” data in structs Structs are like arrays, but the elements can be different types. Same with objects

struct st {char a;int b;char c;short d;

}

Page 13: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Rearranging struct elements can sometimes remove padding

struct st {char a;int b;char c;short d;

}

Page 14: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Rearranging struct elements can sometimes remove padding (and sometimes not…)

struct st2 {int a;char *d;short c[4];char b;

}

0 4 6 8 10 12 14 16

a bc[0] c[1] c[2] c[3]d

Page 15: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Arrays of structs must align with the largest element in the struct

struct st2 {int a;char *d;short c[4];char b;

}st2 struct_array2[2];

struct_array[0]

struct_array[1]

Page 16: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

How big is this structure?struct{

char c;

char *c_ptr[4];

}

Page 17: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Clockwise/Spiral Rule http://c-faq.com/decl/spiral.anderson.htmlParse any C declaration in your head!

Starting with the unknown element, move in a spiral/clockwise direction; when encountering the following elements replace them with the corresponding English statements:

1. [X] or [] => Array X size of... or Array undefined size of...2. (type1, type2) => function passing type1 and type2 returning...3. * => pointer(s) to...

Keep doing this in a spiral/clockwise direction until all tokens have been covered.Always resolve anything in parenthesis first!

char *str[10];

Page 18: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

More Examples (Arrays and Pointers)

int *x[];

int (*y)[];

Page 19: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

More Examples (Const and Pointers)

const char *chptr;

char * const chptr;

Page 20: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

More Examples (Functions and Pointers)

int *z(int);

int (*q)(int);

Page 21: What does this C code do? - GitHub Pages · Pointers, the Spiral Rule, and Structs How to read C type declarations C Strings ASCII and null -termination Array Indexing vs. Pointers

Summary Pointers are just addresses!! “Pointees” are locations in memory

Pointer arithmetic updates the address held by the pointer “string ++” points to the next element in an array Pointers are typed so address is incremented by sizeof(pointee)