home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / C.TUTOR.1.SFX / lesson6 < prev    next >
Encoding:
Text File  |  1991-03-07  |  15.0 KB  |  663 lines

  1.  
  2. ├ ╠ANGUAGE ╘UTORIAL
  3. -------------------
  4. ╠ESSON 6 OF 11
  5.  
  6.  
  7. ╬OTE: SUBSTITUTIONS FOR SPECIAL C
  8. LANGUAGE CHARACTERS:
  9.  
  10. LEFT CURLY BRACKET:   █
  11. RIGHT CURLY BRACKET:  ▌
  12. BACK SLASH:           \
  13. TILDE:                »
  14. VERTICAL BAR:         ▀
  15. UNDERSCORE:           ñ
  16.  
  17.  
  18. ╨OINTERS AND ARRAYS -
  19.  
  20. ╥ECALL THAT, WHEN WE REFER TO &X, C 
  21. WILL INTERPRET THIS AS THE ADDRESS 
  22. IN MEMORY OF THE VARIABLE X.  ╘HE 
  23. ADDRESS IN MEMORY OF A DATA ITEM IS 
  24. REFERRED TO AS THE 'LVALUE', OR 
  25. 'LEFT VALUE' OF THAT ITEM. ╔T REFERS 
  26. TO THAT ITEM'S LOCATION. ╘HE 
  27. 'RVALUE', OR 'RIGHT VALUE' OF A DATA 
  28. ITEM IS WHAT HAS BEEN STORED AT THE 
  29. LOCATION GIVEN BY THE 'LVALUE'. ╔N 
  30. OTHER WORDS THE 'LVALUE' IS WHAT HAS 
  31. BEEN ASSIGNED TO THE DATA ITEM.  
  32.  
  33. ╚ERE &X IS A POINTER.
  34.  
  35. ╔F WE SET Y=&X, IN OUR PROGRAM, THEN 
  36. Y POINTS TO THE VARIABLE X  ( Y IS 
  37. NOW AN ADDRESS, IN MEMORY ).  ╘HIS 
  38. MEANS THAT THE RVALUE OF Y IS THE 
  39. LVALUE OF X. ╙O Y HOLDS THE LOCATION 
  40. OF X AND IS SAID TO POINT TO X.
  41.  
  42. ╚OW DO WE DECLARE A POINTER VARIABLE?
  43.  
  44. ╔N ADDITION TO THE & OPERATOR (WHICH 
  45. RETURNS THE ADDRESS, OR LVALUE, OF 
  46. THE VARIABLE WHICH FOLLOWS IT), 
  47. THERE IS THE C OPERATOR *.  
  48.  
  49. ╔F Y POINTS TO INT X, THEN *Y IS THE 
  50. CONTENTS OF THE MEMORY LOCATION 
  51. POINTED TO BY Y. ╫HEN A PROGRAM 
  52. REFERS TO *Y, THE C COMPILER WILL GO 
  53. TO THE ADDRESS GIVEN BY THE POINTER 
  54. Y, EXTRACT THE INTEGER IT FINDS 
  55. THERE, AND USE THIS INTEGER IN PLACE 
  56. OF *Y. ╫HEN Y POINTS TO X THE 
  57. EXPRESSION *Y GIVES US X'S LVALUE.
  58. THIS POSES A PROBLEM.....
  59.  
  60. ╚OW IS THE COMPILER TO KNOW WHETHER 
  61. THE CONTENTS OF THE ADDRESS Y, 
  62. (WHICH WE REFER TO AS *Y, IN OUR 
  63. PROGRAM) IS AN INTEGER OR A FLOATING 
  64. POINT NUMBER OR A CHARACTER 
  65. VARIABLE???  
  66.  
  67. ╙INCE AN INTEGER OCCUPIES 2 BYTES
  68. (USUALLY ..DEPENDING UPON THE 
  69. COMPUTER YOU ARE USING) AND A SINGLE 
  70. CHARACTER VARIABLE UTILIZES JUST 1 
  71. BYTE (EVEN THOUGH ACTUAL STORAGE FOR 
  72. A CHARACTER IS 2 BYTES WHEN IT IS 
  73. MANIPULATED BY A FUNCTION, BUT MORE 
  74. OF THIS LATER) AND A FLOAT OCCUPIES 
  75. 4 BYTES ...ETC...ETC...THEN IT'S 
  76. CLEARLY IMPORTANT THAT THE COMPILER 
  77. KNOW THAT Y IS POINTING TO AN INT OR 
  78. A CHAR OR A FLOAT ...ETC.  
  79.  
  80. ╙O ... WE MUST DECLARE THE TYPE OF 
  81. VARIABLE THAT Y POINTS TO! TO DO 
  82. THIS WE DECLARE THE CONTENTS OF Y, 
  83. WHICH IS *Y.  
  84.  
  85. 1 MAIN() 
  86. 2 █
  87. 3 INT *Y; 
  88. 4 INT X=123;  /* X=INTEGER 123  */
  89. 5 Y=&X;       /* Y=ADDRESS OF X */
  90. 6 PRINTF("THE VALUE OF X IS %D.",*Y);  
  91. 7 ▌  
  92.  
  93. ╘HIS PROGRAM WILL (CORRECTLY) PRINT: 
  94. THE VALUE OF X IS 123.  
  95.  
  96. ╬OTE THAT, IN LINE 5, Y IS MADE A 
  97. POINTER, POINTING TO X AND X IS AN 
  98. INT ....SO  ...IN LINE 3 WE 
  99. DECLARE OUR POINTER Y AS: INT *Y  
  100. SINCE IT POINTS TO AN INT.  
  101.  
  102. ╥EMEMBER!! IF  SAM  IS A POINTER TO 
  103. SOME  VARIABLE,  THEN BE SURE TO 
  104. DECLARE *SAM AS THE SAME  TYPE AS 
  105. THE VARIABLE TO WHICH SAM POINTS!  
  106.    
  107. IF X IS AN INT  AND Y=&X THEN 
  108. DECLARE: INT *Y
  109. IF X IS A CHAR AND Y=&X THEN 
  110. DECLARE: CHAR *Y 
  111. IF X IS A FLOAT AND Y=&X THEN 
  112. DECLARE: FLOAT *Y 
  113.  
  114.  
  115.  
  116. ╓ARIABLES AND THEIR HOMES IN MEMORY -
  117.  
  118. ╫E'VE MENTIONED THAT THE CHAR C 
  119. UTILIZES 1 BYTE OF MEMORY, AND THAT 
  120. INT I OCCUPIES 2 BYTES AND FLOAT F 
  121. OCCUPIES 4 BYTES.  
  122.  
  123. ╙UPPOSE PC=&C IS A POINTER TO C,
  124. AND PI=&I AND PF=&F.  
  125.  
  126. ╫HERE DOES PC+1 POINT TO ?  
  127.  
  128. ╫HERE DOES PI+1 POINT TO ?  
  129.  
  130. ╫HERE DOES PF+1 POINT TO ?  
  131.  
  132. ╘HE FACT THAT PC IS A POINTER TO A 
  133. CHAR, BECAUSE WE WOULD HAVE DECLARED 
  134. IT WITH CHAR *PC, AND BECAUSE A CHAR 
  135. ONLY OCCUPIES 1 BYTE, THEN C IS 
  136. SMART ENOUGH TO KNOW THAT PC-2 IS 
  137. THE ADDRESS OF THE MEMORY LOCATION 2 
  138. BYTES BELOW PC.  
  139.  
  140. ╬OW PI POINTS TO A (2 BYTE) INT, SO 
  141. C ARRANGES THAT PI-1 POINTS 2 BYTES 
  142. EARLIER THAN PI ...THAT WAY IT WILL 
  143. POINT TO THE IMMEDIATELY PRECEDING 
  144. INTEGER.  
  145.  
  146. ╔N THE CASE OF FLOATS, PF+1 POINTS 
  147. TO THE VERY NEXT FLOAT, 4 BYTES PAST 
  148. WHERE PF POINTS.  
  149.  
  150. ╔N 'THE C PROGRAMMING LANGUAGE', BY 
  151. ╦ERNIGHAN & ╥ITCHIE THE POINT IS 
  152. MADE THAT, 'POINTER ARITHMETIC IS 
  153. CONSISTENT...ALL POINTER 
  154. MANIPULATIONS AUTOMATICALLY TAKE 
  155. INTO ACCOUNT THE SIZE OF THE OBJECT 
  156. POINTED TO...'
  157.  
  158. ╬OTE:IF WE HAVE... 
  159.  
  160. MAIN() 
  161.   FLOAT F,*PF;
  162.   F=12.3;
  163.   PF=&F;
  164.  
  165. ╔S THERE ANY TIME THAT WE WILL KNOW 
  166. WHAT IS 4 BYTES PAST THE ADDRESS OF 
  167. F?  ╘HERE IS ONE CIRCUMSTANCE WHERE 
  168. WE WILL KNOW "WHAT COMES AFTER".  
  169.  
  170.  
  171. ┴RRAYS -
  172.  
  173. ┘OU MAY RECALL, FROM AN EARLIER 
  174. LESSON, THAT WE DEFINED A STRING BY 
  175. DECLARING IT TO BE AN ARRAY OF 
  176. (SINGLE) CHARACTERS.  
  177.  
  178. ╫E'LL REPRODUCE IT HERE:
  179.  
  180. CHAR X[10]; 
  181. DEFINES AN ARRAY OF 10 ELEMENTS.
  182. X[0]='A';   
  183. THE FIRST ELEMENT IS THE CHAR A.
  184. X[1]='B';   
  185. THE SECOND ELEMENT IS THE CHAR B.
  186. X[2]=' ';   
  187. THE THIRD ELEMENT IS THE CHAR (SPACE).
  188. X[3]='\0';  
  189. THE LAST ELEMENT IS THE 'NUMBER' 0.
  190. PRINTF("THE STRING IS %S",X);
  191. PRINT THE STRING, UP TO THE 0.
  192.  
  193. ...AND THE PRINTOUT WOULD BE: 
  194. THE STRING IS AB
  195.  
  196. MAIN() 
  197. CHAR X[10], *PX;  
  198. X[0]='A'; 
  199. X[1]='B'; 
  200. X[2]=' '; 
  201. X[3]='\0';
  202. PRINTF("THE STRING IS %S",X); 
  203.  
  204. ╬OW, IF WE DEFINE PX=&X[0], A 
  205. POINTER TO THE FIRST ELEMENT IN THE 
  206. ARRAY X[], THEN: WHAT CHARACTER DOES 
  207. PX+2 POINT TO? 
  208. ╘O THE CHARACTER ' ' (A SPACE).  
  209.  
  210. PRINTF("%C%C%C",*PX,*(PX+1),*(PX+2));
  211. WHAT WILL THE ABOVE PRINT?
  212.  
  213. AB (A SPACE ON THE END HERE)
  214.  
  215.  
  216. PRINTF("%C",*PX); WOULD PRINT THE 
  217. CONTENTS OF MEMORY LOCATION PX, 
  218. NAMELY A, AND PRINTF("%C",*(PX+1)); 
  219. PRINTS B, AND PRINTF("%C",*(PX+2)); 
  220. PRINTS (SPACE), AND ALL THREE GIVE: 
  221.  
  222. AB (WITH A SPACE AT THE END)
  223.  
  224. 1 CHAR X[4];
  225. 2 X[0]='A'; 
  226. 3 X[1]='B'; 
  227. 4 X[2]=' '; 
  228. 5 X[3]='\0';
  229. IN THIS PROGRAM EXCERPT, WE DEFINED 
  230. SOME ELEMENTS OF THE ARRAY X[10] BY 
  231. SAYING ( LABORIOUSLY ):X[0]='A'; 
  232. X[1]='B'; X[2]=''; X[3]='\0';  
  233.  
  234. ╞OR A CHAR ARRAY WE CAN ALSO SAY:
  235.  
  236. CHAR X[4]= 'A','B',' ','\0' ;
  237. OR ALSO:
  238. CHAR X[4]="AB \0";
  239.  
  240. ┴S A KIND OF SHORTHAND WHICH MAKES 
  241. LINES 2-5 UNNECESSARY.  
  242.  
  243. ╞OR AN INT ARRAY WE CAN SAY:
  244.  
  245. INT X[3]=11,12,13;
  246.  
  247. ╒NDER CERTAIN CONDITIONS, ALL ARRAYS 
  248. MAY BE INITIALIZED (DEFINED AS THEY 
  249. ARE DECLARED). ╫E'LL TALK ABOUT 
  250. THIS LATER.
  251.  
  252. ═ORE POINTERS AND ARRAYS   
  253.  
  254. ╫HEN WE DEFINE AN ARRAY, SAY:
  255. INT S[10];  
  256. EACH OF S[0], S[1], ETC. 
  257. ARE (2 BYTE) INTEGERS.  
  258. ...AND HERE'S SOMETHING SPECIAL: 
  259.  
  260. S,ALL BY ITSELF,IS A POINTER TO S[0]
  261.  
  262. 1 MAIN() 
  263. 2 █
  264. 3 INT S[3];
  265.   /* DEFINE INTEGER ARRAY */
  266. 4 S[0]=11; S[1]=12; S[2]=13;   
  267.   /* DEFINE MEMBERS OF S[] */ 
  268. 5 PRINTF("%D",S[0]);   
  269.   /* PRINT FIRST INTEGER   */ 
  270. 6 PRINTF("\N%D",*S);   
  271.   /* PRINT WHAT S POINTS TO*/ 
  272. 7 ▌
  273.  
  274. ╠INE 5 WILL PRINT 11 AND LINE 6 WILL 
  275. PRINT 11!..PROVING THAT S[0] AND *S 
  276. ARE THE SAME, RIGHT? ╙O S IS A 
  277. POINTER TO S[0], RIGHT? ╧F COURSE 
  278. IT WOULD HAVE BEEN EASIER TO SAY: 
  279. 3 INT S[3]=11,12,13; AND OMIT LINE 
  280. 4!  ╬OW, SINCE AN ARRAY (ANY ARRAY, 
  281. WHETHER INTS OR CHARS OR FLOATS) HAS 
  282. ITS NAME AS A POINTER (..THINK ABOUT 
  283. THAT! ), THEN NOT ONLY WILL S[2] 
  284. GIVE THE 3RD ELEMENT IN THE ARRAY, 
  285. BUT SO WILL *(S+2) GIVE THE 3RD 
  286. ELEMENT!  
  287.  
  288. ╚ERE'S A PROGRAM YOU'VE SEEN IN AN 
  289. EARLIER LESSON (ON STRINGS): 
  290.  
  291. 1 MAIN() 
  292.   █ 
  293. 2 CHAR S;  
  294.   /* DECLARE A CHAR VARIABLE */ 
  295. 3 S="I AM A STRING";   
  296.   /* INITIALIZE AS A STRING  */ 
  297. 4 PRINTF("%S",S);  
  298.   /* PRINT THE STRING  */ 
  299. 5 PRINTF("\N%S",S+2);
  300. 6 ▌
  301.  
  302. ╠INE 2 DECLARES S TO BE OF TYPE CHAR.  
  303. LINE 3 DEFINES  S TO BE A STRING 
  304. (DOUBLE QUOTES, REMEMBER?). ╠INE 4 
  305. PRINTS THE %STRING, GIVING: I AM A 
  306. STRING LINE 5 PRINTS: AM A STRING 
  307. IE. TWO PAST WHERE S POINTS. 
  308.  
  309. ╚ERE, JUST AS FOR AN ARRAY, S IS A 
  310. POINTER TO THE STRING "I AM A 
  311. STRING". ╔N FACT, S POINTS TO THE 
  312. FIRST ELEMENT: I.  ╚ENCE, S+2 POINTS 
  313. TO THE 3RD ELEMENT (A) AND PRINTF() 
  314. WILL (UPON RECEIPT OF A %STRING 
  315. ADDRESS) PRINT EVERYTHING FROM THAT 
  316. ADDRESS UP TO THE SPECIAL TERMINATING 
  317. '\0' (...REMEMBER HIM?).  
  318.  
  319. ╘HE NAME OF A STRING VARIABLE IS A 
  320. POINTER TO THE FIRST ELEMENT IN THE 
  321. STRING!  
  322.  
  323. ╘HE NAME OF AN ARRAY VARIABLE IS A 
  324. POINTER TO THE FIRST ELEMENT IN THE 
  325. ARRAY !  
  326.  
  327. ╥EMEMBER!
  328.  
  329. ╬OW, IF WE DECLARE CHAR A[30]; THE C-
  330. COMPILER KNOWS THAT 'A' REFERS TO A 
  331. COLLECTION OF 30 CHARS ...AND IT 
  332. KNOWS THIS EVEN BEFORE WE DEFINE THE 
  333. ELEMENTS A[0], A[1], ETC.  
  334.  
  335. ┬UT, IF WE DECLARE CHAR S;, HOW IS 
  336. THE COMPILER TO KNOW WHETHER S IF A 
  337. SINGLE CHAR OR A STRING OF CHARS. ╔F, 
  338. SUBSEQUENTLY, WE SAY S="I AM A 
  339. STRING" THEN S IS A STRING ...BUT IF 
  340. WE SAY S='A' THEN S IS JUST ONE CHAR 
  341. ...BUT SHOULD WE REALLY MAKE THE 
  342. COMPILER FIGURE THIS OUT? ┴FTER ALL, 
  343. THE COMPILER WOULD RESERVE A SINGLE 
  344. BYTE IN MEMORY FOR JUST ONE CHAR BUT 
  345. MAY HAVE TO RESERVE DOZENS OF BYTES 
  346. FOR A STRING OF CHARS!  
  347.  
  348. ═ORAL: DECLARE A SINGLE CHARACTER AS: 
  349.  
  350. CHAR S;
  351.  
  352. DECLARE A STRING OF CHARS AS: 
  353.  
  354. CHAR *S;
  355.  
  356. ╙INCE WE (AND THE COMPILER) KNOW THAT 
  357. THE NAME OF A STRING IS A POINTER 
  358. THEN THE DECLARATION CHAR *S; 
  359. (FOLLOWED PERHAPS BY S="I'M A 
  360. STRING") JUST ANTICIPATES THE 
  361. SUBSEQUENT USE OF S AS THE NAME OF A 
  362. STRING (AS OPPOSED TO A SINGLE 
  363. CHARACTER).  
  364.  
  365. CHAR S;  
  366. S="I AM A STRING";   
  367. PRINTF("%S",S);  
  368.  
  369.  
  370. ┴LTHOUGH WE HAVE USED THE ABOVE 
  371. FORMAT IN EARLIER LESSONS...  
  372.  
  373. ╔T MAY NOT COMPILE! 
  374. ...AND IF IT DOES 
  375.  
  376. ╔T MAY NOT WORK!  
  377.  
  378. CHAR *S; 
  379. ╔F WE USE CHAR *S THEN ALL COMPILERS 
  380. WILL ACCEPT IT.  
  381.  
  382. ╙O IN SUMMARY,WE HAVE:
  383. ╔F S IS THE NAME OF A STRING (DEFINED 
  384. WITH DOUBLE QUOTES) THEN S S+1 S+2 
  385. ETC POINT TO THE 1ST 2ND 3RD 
  386. ETC. MEMBERS OF THE STRING.  ╔F S IS 
  387. THE NAME OF AN ARRAY (DEFINED WITH 
  388. S[0]=... ETC.) THEN S S+1 S+2 ETC. 
  389. POINT TO THE 1ST 2ND 3RD ETC. MEMBERS 
  390. OF THE ARRAY.  ╬OW, DON'T THINK THAT 
  391. STRINGS AND ARRAYS ARE THE SAME 
  392. ...AFTER ALL A STRING IS ONLY AN 
  393. ARRAY OF (SINGLE) CHAR VARIABLES 
  394. WHEREAS WE CAN ALSO HAVE ARRAYS OF 
  395. INTS OR FLOATS OR OTHER INTERESTING 
  396. DATA TYPES.  
  397.  
  398. ╞URTHER, THE NAME OF A STRING 
  399. POINTER IS A VARIABLE: 
  400.  
  401. 1 MAIN()
  402.   █
  403. 2 CHAR *X, *Y, *Z;   
  404.   /* 3 POINTERS TO STRINGS */
  405. 3 X="ABC";   
  406.   /* X POINTS TO STRING ABC */ 
  407. 4 Y="DEF";   
  408.   /* Y POINTS TO STRING DEF */ 
  409. 5 Z=X;   
  410.   /* Z POINTS TO STRING ABC */ 
  411. 6 PRINTF(" THE X-STRING IS %S",Z);  
  412. 7 Z=Y;   
  413.   /* Z POINTS TO STRING DEF */ 
  414. 8 PRINTF(" THE Y-STRING IS %S",Z);  
  415. 9 ▌
  416.  
  417. ╔N LINE 5 WE MAKE Z POINT TO THE SAME 
  418. THING THAT X POINTS TO 
  419. ...AND LINE 6 PRINTS:  
  420.  
  421. THE X-STRING IS ABC
  422.  
  423. ╔N LINE 7 WE MAKE Z POINT TO THE
  424. SAME THING THAT Y POINTS TO 
  425. ...AND LINE 8 PRINTS:  
  426.  
  427. THE Y-STRING IS DEF
  428.  
  429. ┬UT, WE COULD ALSO SAY: 
  430.  
  431. X=Y; 
  432.  
  433. ┴ND MAKE X POINT TO THE Y-STRING!
  434.  
  435.  
  436. ╙TRINGS AND 1-DIMENSIONAL 
  437. CHAR ARRAYS - 
  438.  
  439. ╙UPPOSE WE MAY DECLARE STRINGS C AND 
  440. X BY USING: 
  441.  
  442. 1 CHAR C[9]='C','-','S','T','R',
  443.              'I','N','G','\0';  
  444. 2 CHAR *X="X-STRING";   
  445.  
  446. ╔N THE FIRST INSTANCE, C IS A POINTER 
  447. TO AN ARRAY OF CHARACTER VARIABLES
  448. (8 CHARS: C-STRING, PLUS THE 
  449. TERMINATING '\0').  
  450.  
  451. ╔N THE SECOND INSTANCE, X IS ALSO A 
  452. POINTER, BUT NOW IT'S A POINTER TO A 
  453. STRING: X-STRING WITH (AGAIN) THE 
  454. TERMINATING '\0' (WHICH C LOOKS AFTER 
  455. APPENDING).  
  456.  
  457. ╙O WHAT'S THE DIFFERENCE BETWEEN
  458. CHAR C[]   AND   CHAR *X ???
  459.  
  460. ╔N THE FIRST CASE, C IS A CONSTANT 
  461. POINTER TO THE FIRST ELEMENT OF THE 
  462. ARRAY ...AND CANNOT BE CHANGED. ╔N 
  463. THE SECOND CASE, X IS A VARIABLE 
  464. POINTER TO THE FIRST ELEMENT OF THE 
  465. STRING ...AND CAN BE CHANGED!  
  466.  
  467. 1 CHAR C[9]='C','-','S','T',
  468.              'R','I','N','G','\0';
  469. 2 CHAR *X="X-STRING"; 
  470. 3 PRINTF("  %S   %S ",C,X); 
  471.   /* PRINT %STRINGS  C AND X */  
  472. 4 X=C;  
  473.   /* MAKE X POINT TO C  */  
  474. 5 PRINTF("  %S   %S ",C,X); 
  475.   /* PRINT %STRINGS  C AND X */  
  476.  
  477. ╩UST TO SHOW THAT IT IS X (AND NOT C) 
  478. WHICH IS A VARIABLE, WE 
  479. DECLARE/DEFINE THEM BOTH IN LINES 1 
  480. AND 2.  THEN PRINT THEM BOTH IN LINE 
  481. 3. WE WOULD GET: 
  482.  
  483.   C-STRING   X-STRING
  484.  
  485. ╘HEN WE CHANGE X, IN LINE 4, SO IT 
  486. POINTS TO THE SAME THING AS C DOES, 
  487. THEN PRINT THEM BOTH AGAIN, IN LINE 
  488. 5 WE'D GET: 
  489.  
  490.   C-STRING   C-STRING
  491.  
  492. ┘OU MUST NOT TRY:  
  493.  
  494. C=X;
  495.  
  496. ┬ECAUSE IT WON'T COMPILE!
  497.  
  498. ┴RRAY NAMES POINT (ALWAYS AND 
  499. FOREVER) TO THE FIRST ELEMENT OF THE 
  500. ARRAY!  
  501.    
  502. ╔N ADDITION TO AN ARRAY SUCH AS X[10] 
  503. (WITH 10 ELEMENTS, WHICH MAY BE 
  504. CHAR,INT,FLOAT,ETC.),HERE'S A DOUBLE 
  505. ARRAY: 
  506.  
  507. FLOAT X[5][7];   
  508.  
  509. ╘HIS DECLARES AN ARRAY OF 5*7=35 
  510. FLOATING POINT NUMBERS. ╫E MAY DEFINE 
  511. ANY OR ALL OF THEM (FOR EXAMPLE WE 
  512. MAY WRITE X[2][1]=1.5). ╫E THINK OF 
  513. THIS ARRAY AS BEING ARRANGED LIKE SO: 
  514.  
  515. X[0][0] X[0][1] X[0][2] X[0][3] 
  516. X[0][4] X[0][5] X[0][6] X[1][0] 
  517. X[1][1] X[1][2] X[1][3] X[1][4] 
  518. X[1][5] X[1][6] X[2][0] X[2][1] 
  519. X[2][2] X[2][3] X[2][4] X[2][5] 
  520. X[2][6] X[3][0] X[3][1] X[3][2] 
  521. X[3][3] X[3][4] X[3][5] X[3][6]
  522. X[4][0] X[4][1] X[4][2] X[4][3] 
  523. X[4][4] X[4][5] X[4][6] 
  524.  
  525. ╥EMEMBER IN C ARRAYS ALWAYS START 
  526. WITH ELEMENT NUMBER ZERO!  
  527.   
  528. ╬OW, IF WE DEFINE X[2][1]=1.5, 
  529. THE NUMBER 1.5 GOES HERE:
  530.  
  531. X[2][1]
  532.  
  533. ...AND, AS YOU MIGHT EXPECT, WE CAN
  534. HAVE 3-DIMENSIONAL ARRAYS, ETC.
  535.  
  536. X[I][J][K]
  537.  
  538.  
  539. ╫HEN WE DECLARE A MULTI-DIMENSIONAL 
  540. ARRAY, AS IN FLOAT X[5][7], THE C-
  541. COMPILER KNOWS THAT EACH ELEMENT 
  542. OCCUPIES 4 BYTES IN MEMORY (BECAUSE 
  543. IT'S AN ARRAY OF FLOATS) ...HENCE IT 
  544. KNOWS NOT ONLY HOW MUCH MEMORY IS 
  545. NEEDED BUT WHERE EACH ELEMENT IS. 
  546. ╙TARTING AT THE ADDRESS OF THE FIRST 
  547. ELEMENT, &X[0][0], WE FIND THE 
  548. ADDRESS OF X[2][1] BY MOVING 7*2+1=15 
  549. ELEMENTS ALONG THE ARRAY ...AND AT 4-
  550. BYTES-PER-ELEMENT THAT MEANS MOVING 
  551. 4*15=60 BYTES THROUGH MEMORY.  
  552.  
  553. ╬OTICE HOW IMPORTANT THE NUMBER OF 
  554. COLUMNS IS TO THE C-COMPILER (IN THE 
  555. DECLARATION FLOAT X[5][7] WITHOUT 
  556. THIS DIMENSION THE COMPILER WOULDN'T 
  557. KNOW HOW TO GET TO X[2][1]!  
  558.  
  559. ╔N FACT, YOU MAY LEAVE OUT THE NUMBER 
  560. OF ROWS IN DECLARING THIS ARRAY 
  561. (AND USE FLOAT X[][7] INSTEAD!)! 
  562.  
  563. ┴ 2-DIMENSIONAL ARRAY IS TREATED (BY 
  564. C) AS A 1-DIMENSIONAL ARRAY EACH OF 
  565. WHOSE ELEMENTS IS A 1-DIMENSIONAL 
  566. ARRAY.  
  567.  
  568. ╘HE ARRAY FLOAT X[5][7] CONSISTS OF 5 
  569. 1-DIMENSIONAL ARRAYS, CALLED (IN C-
  570. SPEAK), X[0], X[1], X[2], ETC. AND 
  571. EACH OF THESE 1-DIMENSIONAL ARRAYS 
  572. HAS 7 ELEMENTS.  
  573.  
  574. ╙INCE (FOR EXAMPLE) THE ELEMENT 3  OF 
  575. AN ARRAY SAM IS CALLED SAM[3] THEN 
  576. ELEMENT 3 OF THE (1-DIMENSIONAL) 
  577. ARRAY X[2] IS CALLED X[2][3] 
  578. ...WHICH EXPLAINS THE C-NOTATION 
  579. FOR 2-DIMENSIONAL ARRAYS, X[I][J], 
  580. RATHER THAN (THE MORE USUAL) X[I,J].  
  581.  
  582. ╔N FACT, YOU MAY REFER TO X[2][3] AS 
  583. (X[2])[3] ...MEANING ELEMENT 3 OF 
  584. THE (1-DIMENSIONAL) ARRAY X[2] 
  585. (ACTUALLY THE 4TH ELEMENT SINCE THE 
  586. FIRST IS ELEMENT 0 !!!@#$*).  
  587.  
  588. X[2][0] X[2][1] X[2][2] X[2][3] 
  589. X[2][4] X[2][5] X[2][6]  
  590.  
  591.  
  592. ╔F C REGARDS X[5][7] AS CONSISTING OF 
  593. 5 1-DIMENSIONAL ARRAYS X[0], X[1], 
  594. X[2], X[3], AND X[4] THEN WHAT DOES 
  595. (FOR EXAMPLE) X[2] REFER TO ?  ╫HAT 
  596. HAPPENS IF WE PRINTF() X[2]?  ╔S X[2] 
  597. JUST A NOTATION OR DOES IT REFER TO 
  598. ONE OF THE 5*7=35 MEMBERS OF X[5][7]?
  599.  
  600. ┴CTUALLY, ├ IS VERY CLEVER. X[2] (ALL 
  601. BY ITSELF) IS A POINTER TO THE FIRST 
  602. ELEMENT IN THE 1-DIMENSIONAL ARRAY 
  603. X[2], NAMELY  X[2][0] !  
  604.  
  605. ╥EMEMBER: ALTHOUGH X[2][0] GIVES THE 
  606. VALUE OF ELEMENT X[2][0], X[2] GIVES 
  607. THE ADDRESS OF X[2][0]!!  
  608.  
  609. ╙INCE X[2] IS A POINTER TO X[2][0], 
  610. THEN ADDRESS ARITHMETIC CAN BE USED 
  611. TO OBTAIN THE ADDRESS OF ANY ELEMENT 
  612. IN THE 1-DIMENSIONAL ARRAY X[2].  
  613.  
  614. ╘HAT MEANS THAT WE COULD IDENTIFY THE 
  615. ELEMENT X[I][J] BY POINTING JUST J 
  616. ELEMENTS PAST THE ADDRESS OF X[I][0].  
  617.  
  618. ╘HAT MEANS THAT X[I]+J IS A POINTER 
  619. TO X[I][J] 
  620.  
  621. ╘HAT MEANS THAT THE 'VALUE' OF THIS 
  622. ELEMENT IS *(X[I]+J).  
  623.  
  624. ╥EMEMBER: IF X[I]+J IS A POINTER, 
  625. THEN *(X[I]+J) IS WHAT IT POINTS TO!  
  626. AND THAT MEANS THAT *(X[2]+3) AND 
  627. X[2][3] ARE EQUIVALENT 
  628.  
  629.  
  630.  
  631. ╫HAT'S IN A NAME ? (OF AN ARRAY) -
  632.  
  633. ╘HE  NAME  OF A  1-DIMENSIONAL ARRAY 
  634. IS A POINTER TO THE FIRST ELEMENT OF 
  635. THE ARRAY!  
  636.   
  637.  
  638. ╙O, IF X IS AN ARRAY, DECLARED AS 
  639. INT X[10], THEN X IS A POINTER TO 
  640. X[0] (SINCE X IS 1-DIMENSIONAL).  
  641.  
  642. ┴ND, IF X IS AN ARRAY, DECLARED AS 
  643. INT X[10][15], THEN X[7] IS A 
  644. POINTER TO X[7][0] (SINCE X[7] IS
  645. 1-DIMENSIONAL).  SOUNDS OK!  
  646. ...AND FINALLY, WE MAY: 
  647.  
  648. PRINTF("%D",X[7][2]);   
  649.  
  650. ╘O PRINT THE VALUE OF
  651. THE ELEMENT, OR WE MAY: 
  652.  
  653. PRINTF("%D",*(X[7]+2));
  654.  
  655. ╘O PRINT THE VALUE OF THE SAME 
  656. ELEMENT.
  657.  
  658. [END OF LESSON 6 OF 11]
  659.