, pointer". . *pointer , . ________ /pointer/ _/_______/_ | | | &var2 | | | |_______|_| | | 123 | V ________ / var2 / _/_______/_ | | | 123 | | | |_________| pointer = &var2; *pointer = 123; *(&var2) = 123; var2 = 123; * & . -------------------------------------------------------------------- : *pointer = *pointer + 66; *pointer += 66; -------------------------------------------------------------------- (@). ? /* #1 */ f(), y (" y"). /* #2 */ ptr, - y. /* #3 */ *ptr = 7; *(&y) = 7; *(&main::y)=7; y = 7; main::y=7; . , "y" f() ! -------------------------------------------------------------------- : . void main(){ int x, y; int temporary; /* */ x=1; y=2; temporary=x; x=y; y=temporary; printf("x=%d y=%d\n", x, y); /* x=2 y=1 */ } ----------------------------------------------------------------------- : void swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; } void main(){ int x, y; x = 1; y = 2; swap(&x, &y); printf("x=%d y=%d\n", x, y); } ------------------------------------------------------------------------- : int x; int *ptr1, *ptr2; ptr1 = &x; ptr2 = &x; *ptr1 = 77; printf("%d\n", *ptr2); /* 77 */ . ------------------------------------------------------------------------- : int x; int *ptr1; /* */ x = *ptr1; ptr1 , . " " ( ). . : , .  . "a" int a[5]; . () a[0] a[1] ... a[4]. a &a[0] a | | | V a[0] a[1] a[2] a[3] a[4] _________________________________________ | | | | | | | | | | | | | | | | | | ----------------------------------------- int a[5]; /* , */ void f(int *a){ /* f(int a[]), */ printf("%d\n", a[1]); a[2] = 7; } main (){ a[1] = 777; f(a); /* - */ printf("%d\n", a[2]); } f(a); . : _1: ( ), 0- . _2: . , *pointer, : pointer[n]. . int a[5]; /* */ int *ptr; /* */ ptr = a; /* , ptr = &a[0]; */ ptr[0] = 3; /* a[0] = 3; */ ptr[1] = 5; /* a[1] = 5; */ . ptr = &a[2]; a[0] a[1] a[2] a[3] a[4] _________________________________________ | | | | | | a: | | | | | | | | | | | | ---------------------------------------------- | | | | ... ptr: | | | | ----------------------------- -2 -1 ptr[0] ptr[1] ptr[2] "" a[] ptr[]. ptr[0] a[2] ptr[1] a[3] ptr[2] a[4] ptr[3] a[], , ! ptr[-1] a[1] ptr[-2] a[0] ptr[-3] a[], : . , a[] *a , a[0]. . 19.c /* : char. A B C D ---> D C B A . */ /* ( ) */ #include <stdio.h> /* - . */ /* . , - char, '\0'. \0 . */ int strlen(char s[]){ /* */ int counter = 0; /* */ while(s[counter] != '\0') /* */ counter++; /* */ return counter; /* , '\0' */ } /* . putchar(c). , '\0' - . , , . . */ int putstr(char s[]){ int i = 0; /* */ while(s[i] != '\0'){ putchar(s[i]); i++; } putchar('\n'); return i; } /* . : 1 . : A B C D E F <---------- : B C D E F F - . n - . : : A B C D E F n=6 i=1 B B C D E F i=2 B C C D E F i=3 B C D D E F i=4 B C D E E F i=5 B C D E F F i=6 ==> . */ void shiftLeft(char s[], int n){ int i; for(i=1; i < n; i++) s[i-1] = s[i]; } /* . : - 1, , 1 0 . - > 1, a) . A B C D E F | | V tmp b) B C D E F F c) . tmp | V B C D E F A d) n-1. {B C D E F}A : F E D C B A . s[] - , n - . */ void reverse(char s[], int n){ char tmp; if(n <= 1) /* */ return; tmp = s[0]; /* */ shiftLeft(s, n); /* */ s[n-1] = tmp; /* */ reverse(s, n-1); /* */ } /* . . , , length. */ void reverse1(char s[], int n){ char tmp; int length; for(length=n; length > 1; --length){ tmp = s[0]; shiftLeft(s, length); s[length-1] = tmp; } } char testString[] = "abcdefghijklmnopqrstuvwxyz"; /* , . "..." '\0' . 27. */ void main(){ int len; len = strlen(testString); /* : 26 ('\0' ) */ printf(" : \"%s\", %d\n", testString, len); /* : - ( char) %s - "..." " \" putchar ' putchar('\''); */ /* */ reverse(testString, len); putstr(" :"); putstr(testString); /* - */ reverse1(testString, len); putstr(" :"); putstr(testString); } 19_1.c /* : . A B C D E F G H I J J B C D E F G H I A | | J B C D E F G H I A J I C D E F G H B A | | J I C D E F G H B A J I H D E F G C B A | | ----> <----- J I H D E F G C B A J I H G E F D C B A | | J I H G E F D C B A | | J I H G F E D C B A . */ #include <stdio.h> /* char */ void swap(char *s1, char *s2){ char c; c = *s1; *s1 = *s2; *s2 = c; } void reverse(char s[], int n){ int first, last; first = 0; /* */ last = n-1; /* */ while(first < last){ /* first last */ swap(&s[first], &s[last]); first++; /* */ last--; /* */ } } char testString[] = "abcdefghijklmnopqrstuvwxyz."; void main(){ int len; len = strlen(testString); /* */ reverse(testString, len); printf(" : %s\n", testString); } 19_2.c /* : , . */ #include <stdio.h> char testString[] = "abcdefghijklmnopqrstuvwxyz."; /* sizeof()/sizeof([0]) , . ( ) , . */ char tempString[ sizeof(testString) / sizeof(testString[0]) ]; void reverse(char s[], int n){ int i; /* , tempString[] */ for(i=0; i < n; i++) tempString[n-1-i] = s[i]; tempString[n] = '\0'; /* */ /* */ for(i=0; i < n; i++) s[i] = tempString[i]; s[n] = '\0'; /* */ } void main(){ int len; len = strlen(testString); /* */ reverse(testString, len); printf(" : %s\n", testString); } 19_3.c /* */ #include <stdio.h> int arr[] = {1, 5, 10, 15, 20, 25, 30}; int arrLen = sizeof(arr) / sizeof(arr[0]); /* */ /* */ void printit(int row[], int n){ int i; for(i=0; i < n; i++){ printf("%d", row[i]); if(i == n-1) putchar('\n'); else putchar(' '); } } /* . */ void printShift(int n){ n = arrLen - n; while(n > 0){ printf(" "); n--; } } /* */ void shiftleft(int row[], int n){ int i; for(i=1; i < n; i++) row[i-1] = row[i]; } /* */ void reverse(int row[], int n){ int pocket; printShift(n); /* */ printf("CALLED reverse(row, %d)\n", n); /* */ if(n <= 1){ printShift(n); /* */ printf("return from reverse(row, %d);\n", n); /* */ return; } pocket = row[0]; shiftleft(row, n); row[n-1] = pocket; printShift(n); /* */ printit(arr, arrLen); /* */ reverse(row, n-1); printShift(n); /* */ printf("all done; return from reverse(row, %d);\n", n); /* */ } void main(){ reverse(arr, arrLen); printit(arr, arrLen); } 20.c /* : columns . : 0 4 8 1 5 9 2 6 10 3 7 */ /* n . n < columns, (n=2, columns=4) 0 1 if(n < columns) columns = n; , columns lines columns*lines . : columns*lines >= n . , lines >= n/columns lines = (n + (columns - 1)) / columns; . (y) (x). index(x, y) = (x * lines + y); index >= n, */ #include <stdio.h> int array[100]; void printArray(int a[], int n, int columns){ int lines; /* */ int x, y; /* , - */ int index; /* */ if(n < columns) columns = n; lines = (n + (columns-1)) / columns; /* : , - */ for(y=0; y < lines; y++){ for(x=0; x < columns; x++){ index = x * lines + y; if(index >= n) /* */ break; /* */ /* break ( ) */ /* */ if(x != 0) putchar('\t'); printf("%02d|%d", index, a[index]); /* %02d , , . */ } putchar('\n'); /* */ } } void main(){ int i, cols; /* */ for(i=0; i < 100; i++) array[i] = i + 1; for(cols=4; cols <= 13; cols++){ printf("\t\t* * * %d * * *\n", cols); printArray(array, 77, cols); putchar('\n'); } } 20_1.c #include <stdio.h> main(){ int x, y; int COLUMNS = 11; int LINES = 10; int value; /* */ for(y=0; y < LINES; y++){ /* */ for(x=0; x < COLUMNS; x++){ /* */ value = LINES * x + y; /* , */ if(x > 0) putchar('\t'); /* ... */ printf("%d", value); } putchar('\n'); /* */ } } 20_2.c /* elem(x, y) = LINES * x + y; elem(0, y+1) - elem(COLUMNS-1, y) = 1 + LINES - COLUMNS*LINES; elem(x+1, y) - elem(x, y) = LINES; */ #include <stdio.h> int A = 150; /* */ int COLUMNS = 7; /* */ int LINES; /* */ int value; /* */ int OFFSET_NEXT_COLUMN; int OFFSET_NEXT_LINE; /* */ void line(){ int col; /* */ for(col=0; col < COLUMNS; col++){ if(value >= A) /* */ printf("* "); else printf("%03d ", value); /* */ value += OFFSET_NEXT_COLUMN; /* 1 */ } /* */ putchar('\n'); /* . , value OFFSET_NEXT_COLUMN 1, OFFSET_NEXT_COLUMN + OFFSET_NEXT_LINE 1 - LINES*COLUMNS + LINES, . */ value += OFFSET_NEXT_LINE; /* 2 */ } int main(){ int nline; /* */ LINES = (A + (COLUMNS - 1)) / COLUMNS; OFFSET_NEXT_COLUMN = LINES; OFFSET_NEXT_LINE = 1 - LINES*COLUMNS; for(nline=0; nline < LINES; nline++) line(); /* 0 main() " " */ return 0; } 21.c /* */ /* . : int array[LINES][COLUMNS]; : array[y][x] 0 <= y <= LINES - 1 0 <= x <= COLUMNS - 1 +-------------+-------------+-------------+------> x | array[0][0] | array[0][1] | array[0][2] | ... +-------------+-------------+-------------+ | array[1][0] | array[1][1] | array[1][2] | ... +-------------+-------------+-------------+ | array[2][0] | array[2][1] | array[2][2] | ... +-------------+-------------+-------------+ | ... ... ... V y , , . */ /* , , , . , . . */ #define LINES 31 /* */ #define COLUMNS 79 /* */ char field[LINES][COLUMNS]; /* , . , . */ void line(int x1, int y1, int x2, int y2, char sym){ int dx, dy, i1, i2, i, kx, ky; int d; /* "" */ int x, y; int flag; dy = y2 - y1; dx = x2 - x1; if (dx == 0 && dy == 0){ field[y1][x1] = sym; /* */ return; } kx = 1; /* x */ ky = 1; /* y */ /* */ if( dx < 0 ){ dx = -dx; kx = -1; } /* Y */ else if(dx == 0) kx = 0; /* X */ if(dy < 0) { dy = -dy; ky = -1; } if(dx < dy){ flag = 0; d = dx; dx = dy; dy = d; } else flag = 1; i1 = dy + dy; d = i1 - dx; i2 = d - dx; x = x1; y = y1; for(i=0; i < dx; i++){ field[y][x] = sym; /* */ if(flag) x += kx; /* . */ else y += ky; if( d < 0 ) /* */ d += i1; else{ /* */ d += i2; if(flag) y += ky; /* */ else x += kx; } } field[y][x] = sym; /* */ } int main(){ int x, y; /* */ for(y=0; y < LINES; y++) for(x=0; x < COLUMNS; x++) field[y][x] = ' '; /* */ line(0,0, 0, LINES-1, '*'); line(0,0, COLUMNS-1, 0, '*'); line(COLUMNS-1, 0, COLUMNS-1, LINES-1, '*'); line(0, LINES-1, COLUMNS-1, LINES-1, '*'); line(0,0, COLUMNS-1, LINES-1, '\\'); line(COLUMNS-1,0, 0,LINES-1, '/'); /* */ for(y=0; y < LINES; y++){ for(x=0; x < COLUMNS; x++) putchar(field[y][x]); putchar('\n'); } return 0; }