1 / 34

C Review Pointers, Arrays, and I/O

C Review Pointers, Arrays, and I/O. CS61c Summer 2006 Michael Le. C Advice. Draw stuff out Variables are boxes, pointers are arrows Give a type your variables! & returns a value whose type has one more star than the type of the variable int quux; int* baz = &quux;

curt
Télécharger la présentation

C Review Pointers, Arrays, and I/O

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C ReviewPointers, Arrays, and I/O CS61c Summer 2006 Michael Le

  2. C Advice • Draw stuff out • Variables are boxes, pointers are arrows • Give a type your variables! • & returns a value whose type has one more star than the type of the variable • int quux; int* baz = &quux; • Execute the fundamental operations one at a time • variable lookup, pointer deference, etc

  3. Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; }

  4. y z int int* Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; }

  5. y z int int* 0x4 Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; }

  6. y z int int* 0x4 Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; }

  7. y z int int* 0xD Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; }

  8. y z int int* 0xD Tracing Pointers – Warm Up What will y contain? int main(int argc, char** argv) { int y, *z; y = 4; z = &y; y = *z + 9; return 0; } It contains 0xD. What is that in binary? In decimal?

  9. Tracing Pointers – More Levels What is in foo and bar at the end of this program? int main(int argc, char** argv) { int foo, *bar, **baz, quux; bar = &quux; foo = 4; baz = &bar; **baz = 13; bar = &foo; **baz = 9; return 0; }

  10. foo quux bar baz int int int* int** 410 Tracing Pointers – More Levels What is in foo and quux at the end of this program? int main(int argc, char** argv) { int foo, *bar, **baz, quux; bar = &quux; foo = 4; baz = &bar; **baz = 13; bar = &foo; **baz = 9; return 0; }

  11. foo quux bar baz int int int* int** 410 1310 Tracing Pointers – More Levels What is in foo and quux at the end of this program? int main(int argc, char** argv) { int foo, *bar, **baz, quux; bar = &quux; foo = 4; baz = &bar; **baz = 13; bar = &foo; **baz = 9; return 0; }

  12. foo quux bar baz int int int* int** 410 1310 Tracing Pointers – More Levels What is in foo and quux at the end of this program? int main(int argc, char** argv) { int foo, *bar, **baz, quux; bar = &quux; foo = 4; baz = &bar; **baz = 13; bar = &foo; **baz = 9; return 0; }

  13. foo quux bar baz int int int* int** 910 1310 Tracing Pointers – More Levels What is in foo and quux at the end of this program? int main(int argc, char** argv) { int foo, *bar, **baz, quux; bar = &quux; foo = 4; baz = &bar; **baz = 13; bar = &foo; **baz = 9; return 0; }

  14. What’s wrong with this program? int modifyCount(int x) { x = x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(x); return 0; }

  15. x int 410 What’s wrong with this program? int modifyCount(int x) { x = x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(x); return 0; }

  16. x x int int 410 410 What’s wrong with this program? int modifyCount(int x) { x = x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(x); return 0; }

  17. x x int int 410 310 What’s wrong with this program? int modifyCount(int x) { x = x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(x); return 0; }

  18. x int 410 What’s wrong with this program? int modifyCount(int x) { x = x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(x); return 0; } We never changed x! How do we fix this?

  19. Use Pointers! int modifyCount(int* x) { *x = *x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(&x); return 0; }

  20. x x int int* 410 What’s wrong with this program? int modifyCount(int* x) { *x = *x – 1; } int main(int argc, char** argv) { int x = 4; /* want to change x */ modifyCount(&x); return 0; }

  21. Pointers and ++/-- Suppose we have the following program: int main(int argc, char** argv) { int i, j; int* p = &argc; /* argc = 1 */ i = (*p)++; argc = 1; j = ++(*p); return 0; } What is in i and j?

  22. Pointers and ++/-- Assuming x and y have type int… • y = x++; is equivalent to y=x; x=x+1; • y = ++x; is equivalent to x=x+1; y=x;

  23. Pointers and ++/-- Suppose we have the following program: int main(int argc, char** argv) { int i, j; int* p = &argc; /* argc = 1 */ i = (*p)++; argc = 1; j = ++(*p); return 0; } What is in i and j? i = 1 and j = 2 i = *p; *p = *p + 1; *p = *p + 1; j = *p;

  24. Pointers and [] • x[i] can always be rewritten as *(x+i) and vice versa • Array types can often be converted into their corresponding pointer counterparts • int foo[] is equivalent to int* foo • int* bar[] is equivalent to int** bar • You can at most change one set of [] safely • Changing more requires knowing how the array looks in memory

  25. Pointers and ++/-- Suppose we have the following program: int main(int argc, char** argv) { int i, j; int* p = &argc; /* argc = 1 */ i = (*p)++; argc = 0; j = ++(*p); return 0; } What is in i and j? Both contain 1 i = *p; *p = *p + 1; *p = *p + 1; j = *p;

  26. printf, scanf, and their cousins • printf (and its cousins) are special functions that do not have a fixed argument list • for each format specifier (i.e. %d), an additional argument needs to be supplied • Examples: • printf(“%d”, 4); • printf(“%s%d%c”, “CS”, 0x3D, ‘c’);

  27. printf, scanf, and their cousins • Unlike printf, with scanf for each format specifier (i.e. %d), an additional argument needs to be supplied that has type pointer • Examples: • int z; scanf(“%d”, &z); • char foo[5]; int d; scanf(“%s %d”, foo, &d);

  28. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); }

  29. foo int 0x4d495053 C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); }

  30. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); } foo int 0x4d495053 baz char*

  31. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); } foo int 0x4d495053 baz char*

  32. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); } foo int 0x4d495053 4d 49 50 53 baz char*

  33. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); } foo int 0x4d495053 4d 49 50 53 baz char*

  34. C Program Walkthrough What happens with this program? void quux(int foo) { char a[4]; char* baz = (char*)(&foo); printf("%c%c%c%c", baz[0], *(baz + 1), baz[1+1], baz[sprintf(a, "123")]); } int main(...) { quux(0x4d495053); } foo int 0x4d495053 4d 49 50 53 baz char* It will print out “MIPS”

More Related