home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / c / 12408 < prev    next >
Encoding:
Text File  |  1992-08-16  |  2.2 KB  |  72 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!cs.utexas.edu!sun-barr!ames!daffodil!wyvern!alpha
  3. From: alpha@wyvern.twuug.com (Joe Wright)
  4. Subject: Re: Computer terms, etc
  5. Message-ID: <1992Aug17.032216.5689@wyvern.twuug.com>
  6. Organization: Box 68621, Virginia Beach, 23455
  7. X-Newsreader: Tin 1.1 PL4
  8. References: <19590@fritz.filenet.com>
  9. Date: Mon, 17 Aug 1992 03:22:16 GMT
  10. Lines: 60
  11.  
  12. scotth@felix.filenet.com (Scott Hopson) writes:
  13. : In article <1992Aug13.192456.19127@Synopsys.Com> jerry@synopsys.com (Jerry Huth) writes:
  14. : >
  15. : >Scott Hopson (scotth@filenet.com) says:
  16. : >>> > and what is the diff. between  *foo[] and **foo?
  17. : >>> *foo[] is a pointer to an array
  18. : >
  19. : >No, it's an array of pointers, because [] has higher precedence than *.
  20. : Sorry, it was 2:00 AM when I wrote that, I guess I forgot to put
  21. : "of pointers" on the end.
  22. : *foo[] is a pointer to an array [of pointers]
  23. : thanks for the correction.
  24. : -- 
  25. : Scott Hopson   (scotth@filenet.com)
  26.  
  27. Sorry if I'm beating a dead horse but...
  28.  
  29.     char *foo[] = {"abc", "def"};
  30.     char **bar;
  31.  
  32. foo is an array of pointer to char.  bar is a pointer to a pointer to char.
  33.  
  34.     bar = foo;
  35.  
  36. This works only because the compiler dereferences foo as &foo[0] to create
  37. a pointer value.  This does not make foo a pointer (although bar is).
  38.  
  39. The only place that *a[] and **a can be used interchangeably is in the
  40. declaration of formal parameters in functions.  This because parameters
  41. are passed by value to functions and a would be dereferenced to &a[0],
  42. a pointer and placed in an automatic variable for the function.
  43.  
  44.     fun(foo);
  45.  
  46. fun(a) char *a[]; {}
  47.  
  48. The value passed to fun() is &foo[0] and is placed in a as foo is called.
  49. For this reason **a is legal and would give the char pointed to by the
  50. pointer in a.  To avoid confusion,
  51.  
  52. fun(a) char **a; {}
  53.  
  54. is much preferred.  I'm not confused.  Really I'm not.
  55.  
  56. main(argc, argv) char **argv; {}
  57.  
  58. is preferred for the same reason.  *argv[] is really an array of pointers
  59. and ++argv; would have no meaning.  Actually argv is passed to main as
  60. &argv[0] and placed in a variable on the stack.  Hence the second
  61. declaration is clearer and more correct.  Now ++argv clearly increments
  62. the pointer variable on the stack, not the array.  Clear? 
  63.  
  64. -- 
  65. Joe Wright  alpha@wyvern.twuug.com    
  66.