what does this c code do? - github pages · pointers, the spiral rule, and structs how to read c...
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/1.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/2.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/3.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/4.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/5.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/6.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/7.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/8.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/9.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/10.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/11.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/12.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/13.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/14.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/15.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/16.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/17.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/18.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/19.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/20.jpg)
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](https://reader034.vdocument.in/reader034/viewer/2022042401/5f102f187e708231d447dc10/html5/thumbnails/21.jpg)
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)