Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình

  1. #1
    Ngày gia nhập
    12 2010
    Bài viết
    44

    Mặc định Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình

    void xuat(int a[10], int n)
    {
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// OK
    }
    void main()
    {
    int a[10], n = 10;
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// Lỗi
    }
    Đối số mảng truyền cho hàm không phải hằng con trỏ.
    mình chưa hiểu câu giải thích này .Tại sao *(a++) cua hàm void xuat thì đúng mà của hàm main lại sai

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    744

    Trích dẫn Nguyên bản được gửi bởi biencute Xem bài viết
    void xuat(int a[10], int n)
    {
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// OK
    }
    void main()
    {
    int a[10], n = 10;
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// Lỗi
    }
    Đối số mảng truyền cho hàm không phải hằng con trỏ.
    mình chưa hiểu câu giải thích này .Tại sao *(a++) cua hàm void xuat thì đúng mà của hàm main lại sai
    Biểu thức a++ trong hàm main() sai ngữ nghĩa, nên không thể biên dịch được. Không biên dịch được thì không chạy được. Không chạy được thì biết đúng sai thế nào được.

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

    Trích dẫn Nguyên bản được gửi bởi biencute Xem bài viết
    void xuat(int a[10], int n)
    {
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// OK
    }
    void main()
    {
    int a[10], n = 10;
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// Lỗi
    }
    Đối số mảng truyền cho hàm không phải hằng con trỏ.
    mình chưa hiểu câu giải thích này .Tại sao *(a++) cua hàm void xuat thì đúng mà của hàm main lại sai
    Bạn thử post full code lên chứ mình chả hiểu mục đích của đoạn code trên là thế nào cả .Hàm main chả có lời gọi hàm nào cả,cũng không thấy gán giá trị cho các phần tử của mảng a

  4. #4
    Ngày gia nhập
    12 2010
    Nơi ở
    Hà Nội
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi biencute Xem bài viết
    void xuat(int a[10], int n)
    {
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// OK
    }
    void main()
    {
    int a[10], n = 10;
    for (int i = 0; i<n; i++)
    printf(“%d”, *(a++));// Lỗi
    }
    Đối số mảng truyền cho hàm không phải hằng con trỏ.
    mình chưa hiểu câu giải thích này .Tại sao *(a++) cua hàm void xuat thì đúng mà của hàm main lại sai
    Không có một lời gọi hàm "xuat" nào mà cũng biết được OK :(. Hay là bạn đoán thôi?!? Hix, hàm main và hàm xuat chẳng liên quan, mà cái này là cái gì vậy? *(a++) ?!?

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

    Khi bạn khai báo mảng trong hàm main thì tên mảng (ở đây là a) là hằng con trỏ, vì là hằng nên khi bạn viết a++ tức là cố tình thay đổi hằng số nó sẽ báo lỗi.
    Khi bạn truyền mảng vào hàm, nó lại chỉ truyền cái địa chỉ của mảng, cái a bạn thao tác trong hàm là một biến con trỏ được tạo ra và trỏ tới địa chỉ mảng truyền vào. Vì thế thay đổi nó vô tư.
    @kendosan: khi viết *(a++) (nếu a là biến con trỏ) thì nó sẽ cộng 1 vào a, tức là trị a = địa chỉ phần tử tiếp theo, sau đó dùng toán tử * lấy giá trị nó để xuất ra.

  6. #6
    Ngày gia nhập
    06 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    48

    Mặc định Cách truyền mang 1 chiều cho hàm bài con trỏ và mảng một chiều ai có thể giải thích giúp mình

    bài của chủ thớt khi compile, nó không báo lỗi lệnh print trong hàm xuat(), nhưng lại báo lỗi lệnh print trong hàm main(), vậy nên chắc ý chủ thớt OK là việc ko bị báo lỗi.

    Đây là cái lỗi nó báo tại dòng có lệnh print trong hàm main():
    Code:
    error: lvalue required as increment operand
    Còn code thì ở hàm main, mình sử dụng 1 con trỏ p thay cho a thì thấy nó ok nè
    à ngoài ra mình còn bổ sung phần khởi tạo giá trị ban đầu cho các phần tử mảng a[] nữa.
    C++ Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. void xuat(int a[10], int n)
    5. {
    6.     for (int i = 0; i<n; i++)
    7.     printf("%d", *(a++));
    8. }
    9.  
    10. int main()
    11. {
    12.     int a[10], n = 10;
    13.     int *p;
    14.     p = a;
    15.  
    16.     for (int i = 0; i<n; i++) a[i] = i;
    17.  
    18.     xuat(a, n); // thêm lời gọi hàm xuat() để cho thấy nó chạy tốt :D
    19.  
    20.     for (int i = 0; i<n; i++)
    21.     printf("%d", *(p++));
    22.     return 0;
    23. }

    Trích dẫn Nguyên bản được gửi bởi j3amboo Xem bài viết
    Khi bạn khai báo mảng trong hàm main thì tên mảng (ở đây là a) là hằng con trỏ, vì là hằng nên khi bạn viết a++ tức là cố tình thay đổi hằng số nó sẽ báo lỗi.
    Khi bạn truyền mảng vào hàm, nó lại chỉ truyền cái địa chỉ của mảng, cái a bạn thao tác trong hàm là một biến con trỏ được tạo ra và trỏ tới địa chỉ mảng truyền vào. Vì thế thay đổi nó vô tư.
    bravo, đúng roài
    Java Code:
    1. System.out.println("We are electric !");

  7. #7
    Ngày gia nhập
    12 2010
    Bài viết
    44

    thanks cac ban gio thi minh da hieu

  8. #8
    Ngày gia nhập
    11 2010
    Nơi ở
    Black Hole
    Bài viết
    824

    Trích dẫn Nguyên bản được gửi bởi tungcheng Xem bài viết
    bài của chủ thớt khi compile, nó không báo lỗi lệnh print trong hàm xuat(), nhưng lại báo lỗi lệnh print trong hàm main(), vậy nên chắc ý chủ thớt OK là việc ko bị báo lỗi.

    Đây là cái lỗi nó báo tại dòng có lệnh print trong hàm main():
    Code:
    error: lvalue required as increment operand
    Còn code thì ở hàm main, mình sử dụng 1 con trỏ p thay cho a thì thấy nó ok nè
    à ngoài ra mình còn bổ sung phần khởi tạo giá trị ban đầu cho các phần tử mảng a[] nữa.
    C++ Code:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3.  
    4. void xuat(int a[10], int n)
    5. {
    6.     for (int i = 0; i<n; i++)
    7.     printf("%d", *(a++));
    8. }
    9.  
    10. int main()
    11. {
    12.     int a[10], n = 10;
    13.     int *p;
    14.     p = a;
    15.  
    16.     for (int i = 0; i<n; i++) a[i] = i;
    17.  
    18.     xuat(a, n); // thêm lời gọi hàm xuat() để cho thấy nó chạy tốt :D
    19.  
    20.     for (int i = 0; i<n; i++)
    21.     printf("%d", *(p++));
    22.     return 0;
    23. }



    bravo, đúng roài
    Sau vòng for trong main() thì p sẽ nằm ở đâu ? Có thể giải thích giúp ko ?
    Come as guest...... stay as family......... because we're smiling together.

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

    con trỏ p sẽ nằm ở cuối mảng.làm hư vậy ta sẽ rất dễ mất mảng.bạn nên thay *(p++) bằng *(p+i)

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

  1. Kỹ thuật C++ Lời giải về Chuỗi Ký tự,mảng số nguyên 1 chiều,mảng 2 chiều,tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:54 AM
  2. Lời giải bài tập: Chuỗi Ký tự, mảng số nguyên 1 chiều, mảng 2 chiều, tạo Menu
    Gửi bởi xuanngoc trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 15-10-2011, 01:17 AM
  3. Kỹ thuật C Truyền dữ liệu mảng 2 chiều kiểu char cho hàm (đơn giản)
    Gửi bởi azurelonely trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 24-05-2011, 11:21 PM
  4. Sắp xếp các phần tử mảng 2 chiều theo chiều giảm dần trên mỗi cột
    Gửi bởi bi_ngo_9x trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 09-12-2010, 10:43 PM
  5. Truyền mảng 2 chiều qua hàm giúp mình với
    Gửi bởi comeonbaby trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 18-01-2008, 08:56 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