tek4

Con trỏ và mảng trong C++

by - September. 26, 2021
Kiến thức
Học
<p>Con trỏ v&agrave; mảng trong C++ l&agrave; hai kh&aacute;i niệm cơ bản v&agrave; quan trọng trong khi lập tr&igrave;nh. Trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ t&igrave;m hiểu về mối quan hệ giữa mảng v&agrave; con trỏ c&ugrave;ng với c&aacute;c v&iacute; dụ minh chứng.</p> <h1>Con trỏ v&agrave; mảng</h1> <p>Trong C ++, con trỏ l&agrave; biến lưu trữ địa chỉ của c&aacute;c biến kh&aacute;c. Một con trỏ kh&ocirc;ng chỉ c&oacute; thể lưu trữ địa chỉ của một biến m&agrave; c&ograve;n c&oacute; thể lưu trữ địa chỉ của c&aacute;c phần tử trong một mảng.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>int *con_tro; int mang [6]; con_tro = mang;</code></pre> <p>Ở đ&acirc;y, con_tro l&agrave; một biến con trỏ v&agrave; mang l&agrave; một mảng c&oacute; kiểu dữ liệu int. Đoạn m&atilde; con_tro = mang; sẽ lưu trữ địa chỉ của phần tử đầu ti&ecirc;n trong mảng ở b&ecirc;n trong con trỏ.</p> <p>Lưu &yacute; rằng ch&uacute;ng ta đ&atilde; sử dụng mang thay v&igrave; &amp;mang [0]. Mặc d&ugrave; cả hai c&aacute;ch đều giống nhau. V&igrave; vậy, đoạn m&atilde; b&ecirc;n dưới sẽ hoạt động giống với đoạn m&atilde; b&ecirc;n tr&ecirc;n.</p> <pre class="language-cpp"><code>int *con_tro; int mang[6]; con_tro = &amp;mang[0];</code></pre> <p>Địa chỉ cho c&aacute;c phần tử c&ograve;n lại của mảng sẽ l&agrave; &amp;mang [1], &amp;mang [2], &amp;mang [3], &amp;mang [4] v&agrave; &amp;mang[5].</p> <h2>Trỏ đến mọi phần tử trong mảng</h2> <p>Giả sử ch&uacute;ng ta cần trỏ đến phần tử thứ tư của mảng bằng c&aacute;ch sử dụng c&ugrave;ng một con trỏ. Ở đ&acirc;y, nếu con trỏ đến phần tử đầu ti&ecirc;n trong v&iacute; dụ tr&ecirc;n th&igrave; con_tro + 3 sẽ trỏ đến phần tử thứ tư của mảng.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>int *con_tro; int mang[6]; con_tro = mang;</code></pre> <p>Trong đ&oacute;:</p> <ul> <li>con_tro + 1 tương đương với &amp;mang [1];</li> <li>con_tro + 2 tương đương với &amp;mang [2];</li> <li>con_tro + 3 tương đương với &amp;mang [3];</li> <li>con_tro + 4 tương đương với &amp;mang [4];</li> <li>con_tro + 5 tương đương với &amp;mang [5];</li> </ul> <p>Tương tự, ch&uacute;ng ta c&oacute; thể truy cập c&aacute;c phần tử bằng con trỏ.</p> <p>V&iacute; dụ:</p> <pre class="language-cpp"><code>* con_tro == mang[0];</code></pre> <p>Trong đ&oacute;:</p> <ul> <li>* (con_tro + 1) tương đương với mang[1];</li> <li>* (con_tro + 2) tương đương với mang[2];</li> <li>* (con_tro + 3) tương đương với mang[3];</li> <li>* (con_tro + 4) tương đương với mang[4];</li> <li>* (con_tro + 5) tương đương với mang[5];</li> </ul> <p>Giả sử nếu ch&uacute;ng ta đ&atilde; khởi tạo con_tro = &amp; mang[2];</p> <ul> <li>con_tro - 2 tương đương với &amp; mang[0];</li> <li>con_tro - 1 tương đương với &amp; mang[1];</li> <li>con_tro + 1 tương đương với &amp; mang[3];</li> <li>con_tro + 2 tương đương với &amp; mang[4];</li> <li>con_tro + 3 tương đương với &amp; mang[5];</li> </ul> <p><img class="aligncenter wp-image-7284 size-full" style="display: block; margin-left: auto; margin-right: auto;" src="https://tek4.vn/wp-content/uploads/2020/12/Capture-181.png" alt="Con-tro-va-mang-trong-C++" width="745" height="336" /></p> <p><strong>Ch&uacute; &yacute;: Địa chỉ giữa con_tro v&agrave; con_tro + 1 ch&ecirc;nh nhau 4 byte. Đ&oacute; l&agrave; bởi v&igrave; con_tro l&agrave; một con trỏ đến một dữ liệu kiểu int. V&agrave; k&iacute;ch thước của int l&agrave; 4 byte trong hệ điều h&agrave;nh 64 bit.</strong></p> <p>Tương tự, nếu con trỏ con_tro đang trỏ đến dữ liệu kiểu char, th&igrave; địa chỉ giữa con_tro v&agrave; con_tro + 1 l&agrave; 1 byte. V&igrave; k&iacute;ch thước của một k&yacute; tự l&agrave; 1 byte.</p> <p>V&iacute; dụ: con trỏ v&agrave; mảng trong C++</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; int main(){ int mang[5]; int *con_tro; con_tro = mang; cout &lt;&lt; "Con tro dang tro toi dia chi la: " &lt;&lt; con_tro &lt;&lt;endl ; cout &lt;&lt; "Dia chi cua phan tu mang[0] la: " &lt;&lt; &amp;mang[0]; return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Con tro dang tro toi dia chi la: 0x7ffca7eb2cf0 Dia chi cua phan tu mang[0] la: 0x7ffca7eb2cf0</code></pre> <p>Trong chương tr&igrave;nh tr&ecirc;n, đầu ti&ecirc;n ch&uacute;ng ta chỉ in ra địa chỉ của phần tử đầu ti&ecirc;n trong mảng v&agrave; sau đ&oacute;, ch&uacute;ng t&ocirc;i sử dụng con trỏ ptr để trỏ đến địa chỉ của mang[0].</p> <p><strong>Ch&uacute; &yacute;: Trong hầu hết c&aacute;c ngữ cảnh, t&ecirc;n mảng được chuyển đổi th&agrave;nh con trỏ. Đ&oacute; l&agrave; l&yacute; do tại sao ch&uacute;ng ta c&oacute; thể sử dụng con trỏ để truy cập c&aacute;c phần tử của mảng.</strong></p> <p>Tuy nhi&ecirc;n, ch&uacute;ng ta n&ecirc;n nhớ rằng con trỏ v&agrave; mảng kh&ocirc;ng giống nhau.</p> <p>V&iacute; dụ 2: T&ecirc;n mảng được sử dụng để l&agrave;m con trỏ.</p> <pre class="language-cpp"><code>#include &lt;iostream&gt; using namespace std; int main() { int mang[5]; for (int i = 0; i &lt; 5; ++i) { *(mang + i ) = i + 1; } cout &lt;&lt; "Gia tri cua mang la: " &lt;&lt; endl; for (int i = 0; i &lt; 5; ++i) { cout &lt;&lt; *(mang + i) &lt;&lt; endl ; } return 0; }</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Gia tri cua mang la: 1 2 3 4 5</code></pre> <p>Trong đoạn m&atilde; tr&ecirc;n, ta đ&atilde; khởi tạo c&aacute;c gi&aacute; trị cho từng phần tử của mảng bằng c&acirc;u lệnh:</p> <pre class="language-cpp"><code>*(mang + i) = i + 1;</code></pre> <p>Với i chạy từ 0 tới 5.&nbsp; Đoạn m&atilde; *(mang + i) = i + 1; tương đương với mang[i] = i + 1;</p> <p>Trong b&agrave;i trước như đ&atilde; đề cập, ta sử dụng *con_trỏ để lấy gi&aacute; trị tại đỉa chỉ m&agrave; con trỏ đang trỏ tới. Do đ&oacute; để g&aacute;n gi&aacute; trị tại địa chỉ m&agrave; con trỏ đang trỏ tới sẽ l&agrave; *con_tro = số_n&agrave;o đ&oacute;. Với đoạn m&atilde; *(mang + i) = i + 1 th&igrave; *(mang + i) l&agrave; gi&aacute; trị tại địa chỉ m&agrave; con trỏ mang + i đang trỏ tới.</p> <p><img class="aligncenter wp-image-7285 size-full" style="display: block; margin-left: auto; margin-right: auto;" src="https://tek4.vn/wp-content/uploads/2020/12/Capture-182.png" alt="Vi-du" width="750" height="397" /></p> <p>Tr&ecirc;n đ&acirc;y l&agrave; kh&aacute;i niệm v&agrave; v&iacute; dụ cơ bản về con trỏ v&agrave; mảng trong C++. Hy vọng mọi người c&oacute; thể &aacute;p dụng v&agrave;o trong chương tr&igrave;nh của m&igrave;nh. Mọi người h&atilde;y tiếp tục theo d&otilde;i c&aacute;c b&agrave;i tiếp theo tr&ecirc;n <a href="http://tek4.vn">tek4</a> nh&eacute;!</p>