Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Tại sao phần tử đầu tiên trong mảng là phần tử thứ 0?

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    4

    Mặc định Tại sao phần tử đầu tiên trong mảng là phần tử thứ 0?

    Học về mảng , nhưng mình không hiểu sao , phần tử đầu tiên trong mảng từ ngôn ngữ C trở đi đều là phần tử thứ 0 .

    Thường khi nghĩ đến phần tử đầu thì người ta thường nghĩ đến số 1 .

    Ở trong ngôn ngữ pascal mảng hình như cũng bắt đầu từ 1 , Nhưng từ C trở đi mảng bắt đầu từ phần tử thứ 0 . Có ai giải thích hộ mình với

  2. #2
    Ngày gia nhập
    05 2011
    Bài viết
    299

    đó là quy ước rồi, miễn bàn
    Programming tutorials and source code examples

    Trong nhà không vợ không con
    Uống bia gặm thịt sao ngon thế này
    Nhậu nhẹt không bị la rầy
    Một tuần ta cứ bảy ngày " nâng ly "....

  3. #3
    Ngày gia nhập
    01 2012
    Bài viết
    24

    Array là một dải bộ nhớ liên tục, khi tạo một array ta có pointer tới phần tử đầu tiên của nó.

    Ví dụ: int* array = new int[...];

    Thì theo tự nhiên array = array + 0 sẽ là phần tử đầu tiên, array + 1, array + 2 là các phần tử tiếp theo. Tóm lại là để đếm cho nó dễ thôi.

    array[index] <=> *(array + index) nên lẽ dĩ nhiên index phải bắt đầu từ 0.
    Tuesday 03 January 2012
    Battery Level, 69%

  4. #4
    Ngày gia nhập
    01 2012
    Bài viết
    24

    Chả liên quan gì mấy nhưng mà về mặt toán học mà nói thì 1 không hẳn đã là phần tử đầu tiên, đó chỉ là cách đếm do chúng ta tự quy ước như vậy thôi.

    http://altdevblogaday.com/2011/10/11...me-developers/
    Tuesday 03 January 2012
    Battery Level, 69%

  5. #5
    Ngày gia nhập
    01 2011
    Bài viết
    116

    âu cũng là quy ước, nhưng bạn thử hỏi sao trong dãy số trong toán học hầu hết đều bắt đầu chỉ số bằng 0 mà ko phải 1 - cũng là quy ước cả mà thôi. Mình nghĩ tin học liên hệ rất mật thiết với toán, mảng 1 chiều cũng gần như 1 dãy số, nên có lẽ từ đó người ta quy ước như vậy, nên code C hay các loại khác sẽ khác Pascal là
    for (i=0;i<n;i++)
    mà ko phải for i:=1 to n do

    mà ai bảo bạn là trong Pascal bắt đầu bằng 1, trong Pascal có 1 thuận tiện là mình có thể đặt chỉ số bắt đầu từ đâu và như thế nào mà ( có thể số âm, chữ cái,...)
    C++ Code:
    1. while ( you_live) {
    2. if (you_failed) try_again();
    3. else if ( you_won) find_new_challenge();
    4. }
    5. system("DEATH");
    6. return HELL;

  6. #6
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mặc định Tại sao phần tử đầu tiên trong mảng là phần tử thứ 0?

    Không hẳn là giải thích , nhưng mình nghĩ thế này :
    Khi khai báo 1 mảng , ví dụ :
    C++ Code:
    1. int Mang[4];
    Theo quy ước ,ta sẽ có các phần từ Mang[0] ,Mang[1] , Mang[2] , Mang[3] -> 4 phần từ rồi.
    Nếu bắt đầu từ 1 , tức là ta có các phần từ : Mang[1] , Mang[2] , Mang[3] , Mang[4].
    Vấn đề nảy sinh là phần tử thứ 4 : Mang[4] trùng với khai báo mảng ( int Mang[4]; ).
    Vậy nên có thể cộng đồng lập trình thế giới thống nhất là lấy 0 là chỉ số đầu tiên để phân biệt với khai báo số phần tử mảng với phần tử cuối cùng của mảng.

  7. #7
    Ngày gia nhập
    09 2008
    Bài viết
    223

    Trích dẫn Nguyên bản được gửi bởi luonghm Xem bài viết
    Học về mảng , nhưng mình không hiểu sao , phần tử đầu tiên trong mảng từ ngôn ngữ C trở đi đều là phần tử thứ 0 .

    Thường khi nghĩ đến phần tử đầu thì người ta thường nghĩ đến số 1 .

    Ở trong ngôn ngữ pascal mảng hình như cũng bắt đầu từ 1 , Nhưng từ C trở đi mảng bắt đầu từ phần tử thứ 0 . Có ai giải thích hộ mình với
    Giải thích đơn giản thế này

    Số 0,1,2,3 mà bạn nói chính là offset, hiểu nôm na là độ dịch cơ bản

    Cách viết:
    A. mang[0] sẽ tương đương với &mang + (0 * sizeof(kieudulieu)) == &mang
    B. mang[1] sẽ tương đương với &mang + (1 * sizeof(kieudulieu))

    A = phần tử đầu tiên
    B = phần tử thứ 2

    Ghi chú: &mang là địa chỉ của mang
    Ân oán giang hồ nuôi tôi lớn
    Cuộc đời khốn nạn dạy tôi khôn
    Không đâm không chém đời không nể
    Không tiền không bạc gái không theo

    ----------------------
    Visit my blog: http://nova-soft.net/

  8. #8
    Ngày gia nhập
    01 2012
    Bài viết
    24

    Trích dẫn Nguyên bản được gửi bởi gianghoplus Xem bài viết
    Giải thích đơn giản thế này

    Số 0,1,2,3 mà bạn nói chính là offset, hiểu nôm na là độ dịch cơ bản

    Cách viết:
    A. mang[0] sẽ tương đương với &mang + (0 * sizeof(kieudulieu)) == &mang
    B. mang[1] sẽ tương đương với &mang + (1 * sizeof(kieudulieu))

    A = phần tử đầu tiên
    B = phần tử thứ 2

    Ghi chú: &mang là địa chỉ của mang
    Cái đấy là pointer rồi không cần dấu & đâu, &mang[0] <=> mang
    Tuesday 03 January 2012
    Battery Level, 69%

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi luonghm Xem bài viết
    Học về mảng , nhưng mình không hiểu sao , phần tử đầu tiên trong mảng từ ngôn ngữ C trở đi đều là phần tử thứ 0 .

    Thường khi nghĩ đến phần tử đầu thì người ta thường nghĩ đến số 1 .

    Ở trong ngôn ngữ pascal mảng hình như cũng bắt đầu từ 1 , Nhưng từ C trở đi mảng bắt đầu từ phần tử thứ 0 . Có ai giải thích hộ mình với
    Nếu có ai đó hỏi ngược lại bạn tại sao mảng trong pascal lại bắt đầu từ 1 thì bạn trả lời sao ? Cái này thuộc về quy ước, sao lại thắc mắc những cái như vậy được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Pascal, Fortran chỉ số đầu của mảng là 1 cũng là hợp lý, vì phần lớn phục vụ cho logic tính toán, không hề quan tâm đến địa chỉ bộ nhớ làm gì cả.

    Trong C/C++ và phần lớn các ngôn ngữ chỉ số đầu tiên của mảng là 0. Tại vì, ngoài vấn đề quy ước ra thì bạn cần hiểu:

    Trong C/C++, tên của mảng về bản chất là một pointer (Kevin nói trên khái niệm ngôn ngữ lập trình, không hiểu lầm sang computer machine ở đây nhé!), các chỉ số của mảng thể hiện offset (vị trí) bắt đầu từ đầu mảng đó.

    Ví dụ 2 dòng lệnh sau có ý nghĩa giống hệt nhau:
    char a[5] = { '0', '1', '2', '3', '\0' };
    char* a = { '0', '1', '2', '3', '\0' };


    Một điểm mà ai lập trình C/C++ cũng biết là: a, a + 0, và a[0] cùng một địa chỉ (e hèm, in ra là biết thôi)

    Nếu như chỉ số đầu tiên của mảng là 1, logic về tính toán cộng trừ trên con trỏ, bộ nhớ sẽ khó khăn và rắc rối hơn nhiều, đó là lý do mà phần lớn các ngôn ngữ quy ước chỉ số đầu tiên của mảng là 0. Điều này đã trở thành quen thuộc trong giới lập trình và phát triển phần mềm từ rất lâu!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Tìm phần tử nguyên tố đầu tiên trong mảng
    Gửi bởi mremty trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 17-12-2011, 10:49 PM
  2. Bài tập C Viết hàm tìm vị trí phần tử âm đầu tiên trong mảng
    Gửi bởi HoangCoi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 20-08-2011, 01:30 PM
  3. Chọn phần tử chẵn đầu tiên trong listbox
    Gửi bởi danielh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 11-07-2011, 01:41 PM
  4. thắc mắc xóa phần tử đầu tiên trong mảng
    Gửi bởi prt_awm trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 21-11-2010, 11:08 PM
  5. sửa code tìm vị trí của phần tử có giá trị x xuất hiện đầu tiên trong mảng
    Gửi bởi thangit trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 21
    Bài viết cuối: 29-07-2008, 11:30 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn