C++中的数组问题

1. 数组赋值与初始化

(1)直接初始化:

int arr[]={,,};

(2)遍历访问初始化;

for(i = ;i< ;i++)
//直接读入,或者用别的数组,以及别的(i+1)等。

(3)内存操作函数;

memset(arr,,abs);//abs为另一个已知的数组。

(4)字符串赋值函数,仅限于char型数组。

strcpy(arr,abs) ;abs为一字符串或者char型数组。

2. 数组操作的函数

(1)memset: 作用:Fill block of memory
void * memset ( void * ptr, int value, size_t num );

(2)memcpy: 作用:Copy block of memory
void * memcpy ( void * destination, const void * source, size_t num );

(3)memmove: 作用:Move block of memory
void * memmove ( void * destination, const void * source, size_t num );

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPUAAAHICAIAAAAZQDv1AAAbE0lEQVR4nO3d/3MV5b3A8f0T+uud/tKOjlXHe2u5dYsZq60UuHWUKgXBCnp6wmV0KBpUxOKXRuuYpHI7eMsMjjO9PRqrV473YKaFiAUv0NsKrTlCKg4apphJiIYQE+AAZ9Cy94f99uy3k9182X324Z15DbPZ8+yXnHzy4dmzn/M52hu7DwAq0TTNsL+0zM8GmF7EN1QWEt+F1hKQO7Hi+0tfufqGO38GSGj+3U8svfeJ+Xc/Efrol75ydaz4vv5HTwCymXfX40vuedwwjCX3PD7vrseDA2LH9x2PXRQe2d1vGIZh/N+mFA73q98eMwzD6O/6VfYnbO3n+G8f8T/U3HXcMAzj2O7mzH87dzw2d9n6hSvWL/5314ULF/7xj39cuHBBXLlwxfq5y9Zff8djceP720sfVcJrfzR/i+siBqyzwuWPv5rxkym+cdwwDOOvr0lxwuvs+A470NN/NQzD6H/jP7P+9T16a/GR/dX3vxC+Pv/883fffffzzz8XV+6vvn9r8ZFvL300bnxft+Sn0nn4f/uNQz9PttV/m+Hy8sMzcko//4vR/8ZzSc5kwvOf2RP2PpkNDhTzbGfcrYWHzp8/X/d+7d+/37fm/PnztxYeum7JT+PGd9PidfK4e+uwfXrvP2Wt3Nh5zHC//vJq0+J1Tc+9L6wy9j736l7x+2Nv373YWrN369v9njXDnQ+ta3ro7X5zeau1n/6tG61z8O7ZGr943VN/EXfe8Kcw92Cep29liifsarDtYvdH2/tcxr/6W5avqdfrZ86c6e7u7uzsfPXVV8+cOfOnP/3pzJkzmzdv3rx5c2dn55kzZ+r1+i3L1zQtXhc7vhetlcAvhSD+21Pu+les3/pza5sWrW16cFf//leaHtzV7x/mjBzufNCzoR1Au+4WB1h7MAzf3qxlcYyzw7VNi9Y+tV+M0fCfxRzjeTS7ExaOHtjW8dzfrEczjYGb7vjJ2bNnT9lfzz777KlTp/bs2WN+++67727btu3UqVNnz5696Y6fNC1aGze+r/3hg5na0Dlon9H+l/2Pmk/94M67gysNo7+yQRj8sh0N4rfG3ufCBjy4s98d7K6/uzLsHs4zJuysIh59cn9gfbYnHLGtf0DwyU/X/NvvOX369NjY2PPPP/+LX/zi0UcfHRsb27lz59jY2N///vcnn3xycHBwbGzs9OnT82+/59ofPhg3vr9125oM6bc9+5IT34N/WO59dPn/fGoYhrGv07dV6z4x13360po1+m2de+zlb93mfGvs2egcyB2gr/lDf9iG4uHEMf5z3tgrHjrs3PzrMzzhqG39AwJPcspuvG3FyZMnT5w4sWrVKuffN99888SJE5s2bdq9e/eJEydOnDhx8uTJG29b8a3b1sSNb/0H92dvQYcb5canL91vr//lQcMwjMG3li8I39CKm30v6Qte2iNua31r7PmlcwhhwP1v9TvLwvrlr39q7e0H3jEhJynsOeyUGj+a0gmbIrZ1B5hPsrmT7HxnQWFsbGx4eLi1tXXt2rWrV6/+85///Lvf/W54ePi+++5btmzZsmXLhoeHx8bGvrOgoP/g/rjxfc2C1fJYZv7CDMMwDrYuWH3NgpL9W199zYLV19y/o39fSRjf9uKgYRhG/+tt/pH+b501n754/+pr7t/R7yyHrD/YusA3ZrWbgAd3LGv8U1jhUgp7NK0TjloWt7XPyv6DzPhXf91Ny0ZHR4e8X1u3bvWtGR0dve6mZdcsWB03vr958yrp3Lej3zjwM+vbZ14ccLOmse83d5Y/Eb43+svPmFu56wd23Hnzb6xw+Q9nt+aaT168z9y/vSyuF3difVnrf7bPPdBEzB065+/fZxonLI6P3jb0bDMz5/bfv7lrZGTkuP01MDDw+uuvDwwMOGtGRkZ+/+aub865/Zs3r4ob37NuuhchNrxnGIYx8OaPkm/7oy2fGIZhvPNf8p/wE+8YhmF8vOXpzJ/wr89Zfrn+/cv+9XuO8fHx/v7+8fFxceXl+ve/Pmf5rJvujRvfV//bStie/I34f8XA9qVT28/Hrz0p8wkvfe2Tqf2YM+jy6xZ/+fLZY2NjX7589uXXLQ4OiBvfX5+/ApDCvOar5tx1xfVLv9a08LJrb/3qrPn/dNk1X501/7Jrb/1a08Irrl9y1Zy7/mVeszk4bnz/89wfA5K4as5dV373zituWHr59UtEV9yw9Mrv3nnVnLv++XsFc2Tc+AZyKlZ8j9fqQO4Q31AZ8Q2VEd9QGfENlSWO770HTj+8aXTFMydED28a3XvgdOMjVTtma5qmaZrecSjzHxsXicTxfW/70fc+PHvB+/Xeh2fvbT/a4DBmcE89sr376SpomqbNbuvN/nmEnBLH940r9n3xxRfmu9zOnTv32WefDQ0NjYyM3LhiX/RhzEBsLk/1dA+16QQ0Ekgc31cv3Hbu3LlTp04NDX1y6NAHBw4cPHDg4OHDH129cFv4MXo36Jrz1dzmJmAhWCvNmvhV7DK3daY0mqZpxQ1two40fUNZyOXiyEKlPl6L2uchcSeFyrT9xwI5JY7vS+eVa7XapfPKoo8+OnrpvHLUMcpFJ+yEmDbjXt9QFQe4K61AdII1EIvOruLvM/jfyHT9xwJJJY7vS+ZuHR0dHxuriY4eHbpk7taIYwgxJMSfEKzuAHelmX3tRD5eq/snJ/auxCweGsr+fXr/i4DaEsf3lTe/ffz46WPHTvpcefPb4ccQIrUaPTnxrgybZwt/G8KuusSRvlD2H8g7jWFOcjFIHN+3rPqge8/4yMh50fbdY7es+iD0AIHJSeg8xDe7mOLkJHzG4j2l2W29TE7Ulyy++44OPP/yO4seGLzhx8dEix4YfL7zncN9wZcIPTFkxrong4bPWPxXpeWaeL04u60iRG1w1hG6T8/lprBDJipKSxbfQ8Ojh498fLjvaKjBT0cy/3kA0ZTuz7e2tmb+AwANUH8ClZG/oTLyN1RG/obKyN9QWQ7zd2+3rndXZ/ooUEIO8zfxjdjI31DZzOfv3m5dLxX0Fk1rKVQG2qwF+yGtRdNaNK29rbfhyFpPwRrZUujo1vXutqL9bcWK+LZii6aVKCaBaBryd9S/lt5u3QzfSklzFvTuaq2n4ISjmZIjRw606U6gW38VdulVSbM2FAYAtnTyd3c1uOAmb1Op3GCkOCERvw0dANhmfv4dM2rjjyS+EVt2+bvWU/BNKiJHBuYnxDfiyS5/18TryxZNDNOGI83rS+IbceTw9W8gthy+/g3ERv6GysjfUBn5Gyojf0Nl5G+ojPwNlZG/oTLyN1SW0/rvsGHC5hrlsqjVx3Nb/x02zFlfMx/ivQ7Idf13o2E9BSfWcRHLc/038Y2J5Ln+u0F8WxOb7J9fZCvP9d+NJjxMvlEfV+r1b97lgACFXv8mvhGgUP4GAhTK30BA3Pg+fORjIHemFN+tra2Z/wBAA+RvqIz8DZWRv6Ey8jdUNvP5e9eWb8zavGRWi6a1LPl1db21YD9k3U5/ev2uhiOP7Fxi33tf8pg7zB5QXT9LHPn0+l3ZP7OQwTTk76h/Lbu2fMMMuF9v1pyFWVt2HNm5RNv8gjNm1pYdkSPF8BV2eMQcufkFc2HpzsPiApBW/t6yI7jgJm/T5hcajDS/9e3wyMdCtrb+Wl5YKvwl4KI38/PvmFEbf2R4fJuRLfyfAGSZv4/sXKJ5c23kyMD8xIlvawJjr9davvFYNfPnFPLILn8fEa8vWzQxTzccueQxcWIjZuvq+llcWcIjh69/Byc2JjGXA0c+PpzL178j4psrSwTlMH8DseUwfwOx8f4dqIz370Bl5G+ojPwNlZG/oTLyN1SWh/7fsfZQKlvfOp3Z7P7LvqNk/YwjTXno/91oD1agVzvatWLPeK1eLtqhXylpxZ7x4FGyfsaRplz1/27QMNbJ3FZY18tF+/8E31GyfsaRplz1/44T37WBNr1UrvUUfJvgopSH/t8x9uDMT8zlQrGkdwyM1+rjwaPgYpKH/t+x9iBMPDxXmYGjZP2MI028/g2V8fo3VEb+hsrI31BZ3Pg2jN1A7kwpvltbWzP/AYAGyN9QGfkbKlMlf/d1NTV19WV+GpCMKvmb+EaYmc/ffV1NTeWVTSVNK63c/tZGa8F+SCtpWknTXtnY12hk38ZXNHOkGcS+DQ1rsKaVmja+lflzCnlMQ/6O+tfS19VkRuH2suYsNHX1GdtWauXtzpimrr6okX1dTfbI7SvL24MbGuRvhEsnf3tD0I1mK+lqWknTytujRhrbVpoDnB36NjSIb4Sb+fl3g/j2RWRkfJsD7CgPDWXiG2Gyy9/GtpXORLzxyL6uldas+q2NTa9s7AtsaI50Ejxgyy5/G96ZhpjRw+cnwuWjb0Njt2Hs3r6S60v4qfL6NxBGlde/gTDkb6iM/A2V8f4dqIz370Bl5G+ojPwNlWWRvyfdM41ma0goi/xNfCMtaeTvake70B7NauCtaS16saTr3W1Fp7taT8FupFaoCFtZfbuFDa3egsAE0un/bXUDLBfthvNC90C7+eVAmx7RCNNueUz+RlIp5G8zK3sbXgabF4e2S/b1xSS+kVBq828hyuPEt/OZDVHjgRjS6P9dsKbLA22685kK3kC3HhXmJ8JD1Y52N3/zAQxIIoX87V41OteF5aJ7fenN2e71pTnGN8zakOtLxMP9S6iM+5dQGfkbKiN/Q2Xkb6iM/A2Vkb+hMlnzN7cqMR1krf8mvjEdZK3/Jr4xHWSt/+7oth+ybtebES8MBiYma/23+FClZH06vRZRIA5EkLX+O/gQMxYkJ3H9N/GNKctB/TfxjUmTtf67g/jGNOD+JVQm6/1LYDqQv6Ey8jdURv6GysjfUBn5Gyojf0NlstZ/A9NB1vpvYDrIXP9dKuhm8be1iV0Fbq3XKJfFRGSu/25v662PV0qas2BVgdt9ZSsl3uuAxqSv//YteIb1FJxYB8JIX/9NfGMKpK//bhDf5owl62cQMpO+/jsY386HljD5xkTydv+S1xaRRN7uXxLfSCJv+RtIIm/5G0iC/A2Vkb+hMvI3VJaf/E0XFCSXn/pv4hvJ5af+m/hGcrLWf1fE2/VCsQrxjSRkrf+u9RTsh6od7Vqxh/jGJEhf/12z/0KIbyQnff13jfjG5Mla/838BNNB1vpvri8xHbh/CZXl5/4lkBz5Gyojf0Nl5G+ojPwNlZG/oTLyN1SWn/pvILn81H8Dycla/y30/7b7fIsFKnTWRCyy1n+H9vmulLRiz7i4ADSUh/pvN1v3FLRSuVYvF/nkBsSSh/pvYTZSLrYUKlaUZ/7cQX6y1n9H9fnu7daFOlugMVnrvzui+nzbfyRZP3HIBVnvX0a9hshnNiAJWe9fRsQ3V5ZIRNb8DUwHWfM3MB3I31AZ+RsqI39DZeRvqIz6b6iM+m+oTNb674p3q95AOXhvt72tUyAO+Mlc/y1sFSwHF7flpj0iyFr/7dsqWC5babAtYJG1/tu3FfGNSZG3/tuzVSVQDj7x3wYgbf13xbtVb6AcnPhGDDm5f0kEY1Jycv+S+Mak5CR/A5OSk/wNTAr5Gyojf0Nl5G+ojPwNlVH/DZVR/w2VyVT/7d6Et8tUnEfFZc9I9169UEcOWOSp/xa6wjofNe886h9pLVc72rVij/dRwCVT/bdbQRWoiW2w7K+eBVwS138T35gyeeq/3VmHs2FE9IfNT4hvhJG0/nuCdzCEXV8S3wji/iVUxv1LqIz8DZWRv6Ey8jdURv6GysjfUJk0+ZvXsDEDpKn/Jr4xA6Sp/ya+MQOkqf/2Fs2GVYHT5xuJSVP/ba1sWAVOn28kJFP9tx3NsarAgRgkq/+OXwUOxCBN/bc7P4lZBQ5MTJr675Dry4mqwIGJcP8SKpPm/iUwA8jfUBn5Gyojf0Nl5G+ojPwNlZG/oTJp6r8z3xVUJE399+QQ32hIrvrvQJ23e2+/UBH2Y5aGi7uy7/wDIpnqv/113gNtesQbGiolrdgzXiN/YwKS1X+Ly6G1smLpVY34xgQkq/8Wl0N6xprTkog9AAGy1X+Ly975iTCg2tHu5m8+cwfR5Kv/rvkn6M71ZbnouTCtirvi+hJhuH8JlXH/Eiojf0Nl5G+ojPwNlZG/oTLyN1RG/obKcl7/DTSU8/pvoKH81H93dOt6qaCbj1o7KVTMvxZrPQ3C4ZOf+m+nfrBS0pwFq6WyXVdYKWmUW0GQn/rv4FYhw3oKTqwDOav/Jr6RUA7rvxvENx9gAq/81H93RMe3+HkmWT+hkEr+71/yaiOi5f/+JfGNaPnP30C0/OdvIBr5Gyojf0Nl5G+ojPwNlVH/DZVR/w2V5bL+2x4gFqhQWYUQOaz/rgl13k4jcGcBEOSw/tvapxnrPQWtVK7Vy0XeuYMQOaz/tvZm5fJysaVQsaI882cTsslh/XfNW+fd263THxkRclX/HV7nbf/ZZP1UQkL5uX8Z9aoi79lBtPzcv4yIb64s0UB+8jeQXH7yN5Ac+RsqI39DZeRvqEzi/N24zJAiRMQgcf038Y0pk7j+m/jGlElV/+0t7/assQtXvPXi1ZrQLjnrpxISkqr+21veLaypdrTbrb6F8dYaKgcRScr6b7P8teJ9VMzZNaf0iuBGI1LWf8eMb7273NHO23bQgJT1384Hj9hrqmYch40vFyn+RiSZ6r995d3imkb5vqfA+xsQQZr7l7zehxkgzf1L4hszQJr8DcwAafI3MAPI31AZ+RsqI39DZXnI37y0gsmSuP570uMBm8T135MeD9ikqv+2l2v1QOdvb2tw/2AgnFT1304nqmDnb29rcM9gIJKU9d8NOiOHtk4GIkhZ/018Y5pIWf/doPM38Y0kZKr/9uVs7/Ul8Y1J4P4lVJaH+5fAZJG/oTLyN1RG/obKyN9QGfkbKiN/Q2V5qP8GJisP9d/AZElT/+0bFt4O3FsFnvVzB/lJVf8tDAtvB+6tAs/6uYP8pKn/9g2bsF0y8Y0YpKn/9g0jvjEdJKr/9gwToznQDpz4RkzS1H/7hoW2Aye+kZCs9y+JYEwHWe9fEt+YDrLmb2A6yJq/gelA/obKyN9QGfkbKiN/Q2US13/zEiGmTOL6b+IbUyZr/Xf0sMyfMuSIrPXfUcOAJGSt/44cBiQga/33BMOAWGSt/44aBiQha/135DAgAe5fQmXcv4TKyN9QGfkbKiN/Q2Xkb6iM/A2V5SR/c4sHkyJT/XeDICa+MSky1X8T35hu8tR/C+s9/dm8JSiVkub0TQYmIk39t7i+1lOw11c72rVij/ux87zFAUnIU/8dsd6MaSudE9xIRqb678bxrXeXzVye9VOGHJGm/rsmzmQi5ie1ernoVs8CE5Kn/ltY3+D6stZT0AhxxMX9S6gsJ/cvgUkhf0Nl5G+ojPwNlZG/oTLyN1Qmff6ulMzXzuk/iEmQqf47RE+BakFMgUz136EjqanCFMhT/y3ceO/t1rX2tl73xr65rTWyt1vXSwXdnLRYe2P2glCS1X9bb3Sw5ySRncLb23qF9zpUShrv7kEYmeq/7Uzvlk9FVcz6VvLuNURI7foyXmPvSon4xjSSqf671lOwJuJh8xPiG8mlNj+J1f/bmmFXSo0yPfGN2Lh/CZUR31AZ8Q2VEd9QGfENlRHfUBnxDZUlju+9B04/vGl0xTMnRA9vGt174HTmPwzgkzi+720/+t6HZy94v9778Oy97UcbHKbaMVvTNL3jUOY/MC4qieP7xhX7vvjii3q9Xq/Xz50799lnnw0NDY2MjNy4Yl/0YQ616ZqmzeadCkhZ4vi+euG2c+fOnTp1amjok0OHPjhw4OCBAwcPH/7o6oXbIo5hBrf9pTcXxFivNGuapukbquaCO2yDdb9dXF/sCu6wUOE/B0RKHN+XzivXarVL55VFH3109NJ55ahjeONPzOVdBTuUy0UrWK2VWnPZWtls146bW7mP2vsPrgEsieP7krlbR0fHx8ZqoqNHhy6ZuzXiGP7JiR2p7oInRns36KEZPbjSSudApMTxfeXNbx8/fvrYsZM+V978dvgxnHi111hh3dFsJ2x7ElLsGheSvZDRPcwBVsAzJ0FDieP7llUfdO8ZHxk5L9q+e+yWVR+EHiA4OTYDV0zAbii7fwzWJDsqgqOnK4ArWXz3HR14/uV3Fj0weMOPj4kWPTD4fOc7h/vCXiJ0ZxTWFMVKwG5GN2M0cGUZXO+ZsTSXa57EDwQli++h4dHDRz4+3Hc01OCnIzEOaUat8FohMYoZk3L/EyslC7NqXhrHDKL+BCqTvv8gMAXkb6iM/A2Vkb+hMvI3VJZ6/p5KLx76+CChXOVv4hsJpd7/24pRtwu41b3b/UDuqA9sEBqH8/nciCf1/t++HGy17jY7a9rjo5I0+RsJpd7/29cpU3M6ygof1RD1mSTENxJKvf+3G6MDbbrwkQxxApf4RkKp9/+uWDFa7WjXij32MKE5csNd8XFTSCT1/t9WDhY/O8pu9S18lFRUkrYah3N9iXi4fwmVSRvf3g8HbPS6IRBJ2vgGpgHxDZUR31AZ8Q2VEd9QGf2/obKU+n8rYNJdamlvm6F0+n8rYNJ9WmjwkqUU+n97e3hrmqZvaPO1IDTbDtpfTiGK2EpTK3a5na4qzWYbN3FA406cYvNOz3jfuYW3GPe1MN9QDT3hkF0FNqR5ebrS6P8d6O3ta6UpDDZXCpHhhE6hIjTm1DS9o8vNiyG7Cm5+KHR8WGvPkJ6dkVHonnDornwb0rw8bSn0/xZ+hWF9kMdr/sxXqIQ2JfSEgmfzYHwHNo8Y7+7THRD5iRGBnome/B22K9+GNC9P3cz3/xZCTUjk7i/eXClEQ3M5dM7qCVnPgEByDW4eMb7SHBqI/hbj3r+fsBOuh+8q8IdH8/KUzXj/79APHgmfDMSYnNiT7EYxFHty0ngn7sdLRM4x/Cfs31XUrIbm5amZ6f7fE05OvFdgTlB6LuCay8F5auP/6/2bh40PDcRgi/Gar4V52AlHxbS4YQfNyzOQfv9vID256n8CJET9CVRG/obKyN9QGfkbKiN/Q2Xkb6gsjf5VutiRx+zv4+u01mBl1k8Qcm3m83dvt66XCrrdvYT4RopSyd96d7VSsroNEt9IUSr9v/Xuaq1eLtp97IlvpCWt/F3zBjHxjVSkGN+1erWjvdBBfCM9qca31TXT6o/s9su0eoET35huKce384E7YQ2/PZ9SUir7vs36mUIecf8SKiO+oTLiGyojvqGyWPFthjiQO8Hg9sX3/wMLvbPwSErNOgAAAABJRU5ErkJggg==" alt="" />

3. 求数组的长度

    int a[] = {,,,,,};
int length;
length = sizeof(a) / sizeof(a[]);

4. 函数返回值是数组的问题

一个异常的程序如下:

    #include<stdio.h>
#define N 5
int *print()
{
int a[N];
int i;
for(i=;i<N;i )
a[i]=i; return a;
}
int main()
{
int *b,i;
b=print(); for(i=;i<N;i )
printf("%d\n",b[i]); return ;
}

这个例子就是一个函数返回数组,运行结果是错误的!!!

原因在于: 在函数print()里面 ,数组a[N]是一个局部变量,当你函数执行完之后,会自动释放其空间,所以 return a这句只是返回了一个指向数组a[N]的地值.而在主函数中,b应该接收的是数组a[N]的地址(即数组本身的地址),而它所占用的空间随着函数的调用完 毕也随之被释放掉了,所以得到的答案是不正确的.

程序修改为如下:

    #include<stdio.h>
#include<stdlib.h>
#define N 5
int *print()
{
static int a[N];
int i;
for(i=;i<N;i )
a[i]=i; return a;
}
int *print1()
{
int *a;
int i;
a=(int *)malloc(N);
for(i=;i<N;i )
{
a[i]=i;
} return a;
}
int main()
{
int *b;
// int b[N];
int i;
b=print1(); for(i=;i<N;i )
printf("%d\n",b[i]); return ;
}

无论是调用print()函数还是调用print1()函数都能得到正确结果.原因如下

调用print()函数:
     在数组a[N]前面加入了static关键字,它就使得a[N]存放在内存中的静态存储区中,所占用的存储单元不释放直到整个整个程序运行结束.所以当 主函数调用完print()函数后,该空间依然存在.所以main()函数中b指针接收到这个数组的首地值后可以访问数组中的元素.
  
调用print1()函数:
     把数组a[N]换为指针*a,再给这个指针申请空间,也可以正常运行.因为当给指针a申请空间时,给指针分配的空间在堆上,堆上的空间是由程序员自动给 予分配和释放的.若程序员不释放,程序结束时可能由OS释放.所以main函数中b指针也可以接收到这段空间的首地值,得到正确的答案.
  
注意:
  当把main函数中的 int *b注释掉 换成int b[N] 会出现错误:
test.c:: warning: assignment makes integer from pointer without a cast
或者test.c:: error: incompatible types when assigning to type ‘int[]’ from type ‘int *’
  都不能得到正确结果,原因如下:
main 函数中 b得到的返回值是该数组的首地值,如果是*b,就是指针b指向这个数组的首地值,使指针变量向后移动就可以访问该数组中的所有元素.  
而如果是b[N]的话,相当于编译器在栈上给数组b[N]分配了N个int空间,所以b指向a的首地值,不能通过这个地址,修改其自身申请的值.
只能通 过一个指针通过这个首地值,让指针向后移动来访问源数据.而且因为b没有进行初始化,所以得到的是随机值。
5. 一维数组作为函数参数
实例程序如下:

#include <iostream>
using namespace std; void fun1(int p[])
{
} void fun2(int* p)
{
} void fun3(int p[])//即使a[10]作为参数传递进来,也不会编译出错,因为传递进来的实际上只是a;
{
} void fun4(int (&p)[])
{
}
int main()
{
int a[]={,};
fun1(a);
fun2(a);
fun3(a);
fun4(a);
return ;
}

对于数组a[10]作为实参,对所有的以数组名字(数组的首地址的指针)作为实参的函数的调用得用fun1(a),fun3(a),而不能用fun1(a[10])和fun3(a[]),否则出现编译错误,这是由于数组的大小不作为实参的内容传递的原因。

当将void fun4(int (&p)[10])改成void fun4(int (&p)[])时,编译会出错,提示 error C2664: “fun4”: 不能将参数 1 从“int [10]”转换为“int (&)[8]”

。由此说明只有在fun4函数中,通过引用传递了数组的大小。

fun1,fun2,fun3传递的实际上都是int* p;且数组的大小是不能通过数组名进行传递的。

6. 二维数组作为函数参数

如何将二维数组作为函数的参数传递?写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单,将二维数组当作参数传递的情况如下:

谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下:

可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:
    void Func(int array[3][10]);
    void Func(int array[][10]);
    二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:  void Func(int array[][]);
    因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放,按照行优先),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:
    void Func(int array[3][]);

  实参数组维数可以大于形参数组

例如实参数组定义为:
    void Func(int array[3][10]);
    而形参数组定义为:
    int array[5][10];
    这时形参数组只取实参数组的一部分,其余部分不起作用。

将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的:
  对于数组 int p[m][n];
  如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:
p + i*n + j;

从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:
    void Func(int array[3][10]);
    void Func(int array[][10]);
  变为:
    void Func(int **array, int m, int n);

转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
    *((int*)array + n*i + j);
    在调用这样的函数的时候,需要注意一下,如下面的例子:
    int a[3][3] =
    {
      {1, 1, 1},
      {2, 2, 2},
      {3, 3, 3}
    };
    Func(a, 3, 3);

根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用:
    Func((int**)a, 3, 3);
   其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。

3. 动态申请一个数组与动态释放数组

(1)动态数组中元素是对象本身情况:

  如下操作必然带来内存泄露:

Object是一个类,
Object * pObject = new Object[];
...
delete pObject ; //problem

这时就已经引发内存泄露了,因为此时释放掉的只是object[0]的内存(编译器以&object[0]的地址为参数调用一次析构函数),
等同于delete[1] pObject

而正确的释放应该下面的操作:

delete[] object;
或者是delete[] object;

(2)动态数组中元素之对象的指针情况

申请一个数组,数组中存放的是对象的指针Object **object = new Object *[3];

如下操作是异常的,引发内存泄露!!!

Object是一个类,
Object **object = new Object *[];//只是动态的分配了3个Object对象的指针数组,但它们本身并不是对象
//分配
for(int i = ;i<;++i)
{
object[i] = new Object();
}
...
delete[] object;//problem

其实这样也造成了内存泄露了。此时delete只是指针而非其指向的对象。真正动态产生的对象所占的内存没有被释放掉。

正确操作如下:

for(int i = ;i<;++i)
{
delete object[i] ;
}
delete object;

(3)动态数组问题

通过传入数组长度,程序运行时动态指定数组长度

#include "stdafx.h"
#include <iostream> typedef int* IntPtr; IntPtr fun(const int size)
{
IntPtr p = new int[size];
for (int i = ; i < size; ++i)
{
p[i] = i*;
}
return p;
} int _tmain(int argc, _TCHAR* argv[])
{
IntPtr cP = fun();
for (int i = ; i < ; ++i)
{
std::cout << cP[i] << " ";
}
system("pause");
return ;
}

输出:

C++中的数组问题的更多相关文章

  1. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  2. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  3. java 在循环中删除数组元素

    在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...

  4. Objective-C中把数组中字典中的数据转换成URL

    可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...

  5. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  6. C++中的数组

    数组名作为参数时,传递的是数组的首地址, 主调函数中实参数组元素个数不应该少于形参数组的元素个数 把数组名作为参数时,一般不指定数组第一维的大小 即使指定,编译时也会被忽略的.

  7. javascript中关于数组的一些鄙视题

    一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...

  8. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  9. Javascript中判断数组的正确姿势

    在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...

  10. C#中的数组,多维数组和交错数组

    想研究一些面向对象的东西,也许是代码写得还不够多.感觉还不好,看那些教程,不是嫌太水就是太难看不懂.心情很是落寞 不过再怎样也要坚持每天发一篇博客. 这篇来说一下C#中的数组,多维数组,交错数组的一些 ...

随机推荐

  1. java rsa 加解密

    参考 http://blog.csdn.net/a394268045/article/details/52232120 package rsa; import org.apache.commons.c ...

  2. ios web input 内边阴影

    ios网页中,默认input上部有阴影,去除方法: -webkit-appearance: none;

  3. html标签的总结-重复

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. VideoView的全屏问题

    package com.bi.standardcompuse.app.widgets; import android.content.Context;import android.util.Attri ...

  5. Underscore模版引擎的使用-template方法

    之前项目里有遇到在DOM中增加大量的html结构的时候,傻乎乎的在js中写一堆模版,然后用replace一个一个做替换.当时就是难看了点,不觉得啥,现在了解了模版引擎之后回头来看真的比较捉急了,以后是 ...

  6. linux下给php安装memcached及memcache扩展(转)

    http://kimi.it/257.html (另外的方法)linux安装memcached及memcache扩展一.安装libevent函数库下载地址:http://libevent.org默认被 ...

  7. 结构体的sort【防止遗忘w】

    #include<iostream> #include<algorithm> using namespace std; int n; struct jie { int num; ...

  8. jqgrid单元格合并

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  9. asp.net web 通过IHttpAsyncHandler接口进行消息推送

    .消息类,可直接通过这个类推送消息 HttpMessages using System; using System.Collections.Generic; using System.Linq; us ...

  10. linq 使用or构建动态查询

    You can certainly do it within a Where clause (extension method). If you need to build a complex que ...