{"id":32,"date":"2008-03-20T17:44:21","date_gmt":"2008-03-20T16:44:21","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=32"},"modified":"2008-03-20T17:44:21","modified_gmt":"2008-03-20T16:44:21","slug":"c-un-tableau-comme-argument-dune-fonction","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/03\/c-un-tableau-comme-argument-dune-fonction\/","title":{"rendered":"C++ &#8211; Un tableau comme argument d&rsquo;une fonction"},"content":{"rendered":"<pre class=\"codesource\"><strong>char<\/strong> *c;\r\n<strong>char<\/strong> c[16];<\/pre>\n<p>Ces deux d\u00e9clarations d\u00e9clarent deux variables de types diff\u00e9rents. La premi\u00e8re d\u00e9clare un <em>pointeur de caract\u00e8re<\/em>. La seconde d\u00e9clare un <em>tableau de caract\u00e8res<\/em>. Pour s&rsquo;en convaincre, il suffit de voir que <em>sizeof()<\/em> appliqu\u00e9 aux deux variables donne des r\u00e9sultats diff\u00e9rents. 4 pour le premier et 16 pour le second (sur ma machine, \u00e7a pourrait \u00eatre diff\u00e9rent sur la v\u00f4tre).<\/p>\n<p>Par contre, ces quatre fonctions d\u00e9clarent exactement la m\u00eame fonction. Il n&rsquo;y a aucune diff\u00e9rence entre les quatre.<\/p>\n<pre class=\"codesource\">\r\n<strong>void<\/strong> f(<strong>char<\/strong> *c);\r\n<strong>void<\/strong> f(<strong>char<\/strong> c[]);\r\n<strong>void<\/strong> f(<strong>char<\/strong> c[16]);\r\n<strong>void<\/strong> f(<strong>char<\/strong> c[32]);<\/pre>\n<p>A l&rsquo;int\u00e9rieur des crochets, le nombre ne sert \u00e0 rien. Il peut \u00eatre consid\u00e9r\u00e9 juste comme une indication pour l&rsquo;utilisateur de la fonction.<br \/>\nUn tableau en param\u00e8tre d&rsquo;une fonction est converti en pointeur automatiquement. C&rsquo;est pourquoi, il n&rsquo;y a pas de diff\u00e9rence entre les quatre fonctions.<\/p>\n<p>Vous pouvez m\u00eame passer \u00e0 la fonction une <em>cha\u00eene litt\u00e9rale<\/em> parce qu&rsquo;il existe une conversion de tableau de caract\u00e8res constants vers pointeur de caract\u00e8re. En r\u00e9alit\u00e9, vous passez \u00e0 la fonction l&rsquo;adresse de la cha\u00eene de caract\u00e8res.<\/p>\n<pre class=\"codesource\">f(<span class=\"quotedstring\">\"une cha\u00eene de caract\u00e8res\");    <span class=\"codecomment\">\/\/ OK<\/span><\/span><\/pre>\n<p>A l&rsquo;int\u00e9rieur de la fonction f, <em>c<\/em> est vraiment un pointeur. Les trois fonctions ci-dessous donnent le m\u00eame r\u00e9sultat.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">void<\/span> f1(<span class=\"reservedname\">char<\/span> *c)\r\n{\r\n  std::cout&lt;&lt;<span class=\"quotedstring\">\"size of c in f1: \"<\/span>&lt;&lt;<span class=\"reservedname\">sizeof<\/span>(c)&lt;&lt;std::endl;\r\n}\r\n\r\n<span class=\"reservedname\">void<\/span> f2(<span class=\"reservedname\">char<\/span> c[])\r\n{\r\n  std::cout&lt;&lt;<span class=\"quotedstring\">\"size of c in f2: \"<\/span>&lt;&lt;<span class=\"reservedname\">sizeof<\/span>(c)&lt;&lt;std::endl;\r\n}\r\n\r\n<span class=\"reservedname\">void<\/span> f3(<span class=\"reservedname\">char<\/span> c[32])\r\n{\r\n  std::cout&lt;&lt;<span class=\"quotedstring\">\"size of c in f3: \"<\/span>&lt;&lt;<span class=\"reservedname\">sizeof<\/span>(c)&lt;&lt;std::endl;\r\n}\r\n\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  <span class=\"reservedname\">char<\/span> c[10];\r\n  std::cout&lt;&lt;<span class=\"quotedstring\">\"size of c[10]: \"<\/span>&lt;&lt;<span class=\"reservedname\">sizeof<\/span>(c)&lt;&lt;std::endl;\r\n  f1(c);\r\n  f2(c);\r\n  f3(c);\r\n\r\n  <span class=\"reservedname\">return<\/span> 0;\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>char *c; char c[16]; Ces deux d\u00e9clarations d\u00e9clarent deux variables de types diff\u00e9rents. La premi\u00e8re d\u00e9clare un pointeur de caract\u00e8re. La seconde d\u00e9clare un tableau de caract\u00e8res. Pour s&rsquo;en convaincre, il suffit de voir que sizeof() appliqu\u00e9 aux deux variables donne des r\u00e9sultats diff\u00e9rents. 4 pour le premier et 16 pour le second (sur ma [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/32"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":0,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/32\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}