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ố 14 kết quả

Đề tài: Hỏi về 1 số lệnh liên quan đến phép gán trng C

  1. #1
    Ngày gia nhập
    05 2008
    Nơi ở
    tx tra vinh
    Bài viết
    9

    Question Hỏi về 1 số lệnh liên quan đến phép gán trng C

    Em đang thắc mắc về vài câu lệnh như sau:

    1/ float *a, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?


    Còn các lệnh sau thì hiểu như thế nào:

    //các câu lệnh này ko có liên quan gì với các lệnh trên
    pa = (char*)(&a);

    pa = (char*)malloc(size)


    Em có cuốn sách của tác giả Phạm Văn Ất, trong sách có chương nói về bxl 8086, em mún hỏi bxl này và bxl Celeron(hay là các bxl 32bit hiện tại) khác nhau như thế nào?
    Thank
    Mọi lý thuyết đều màu xám, chỉ có cây đời mãi xanh tươi !!!

  2. #2
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Code:
    1/ float *a, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?
    Mình nghĩ bạn đã viết sai, đúng của nó là:
    Code:
    1/ float *pa, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?
    (float*) là ép kiểu cho biến con trỏ. Mình thấy trong sách đã giải thích phần này rất rõ.
    a được khai báo kiểu float[3]
    pa đươc khai báo kiểu con trỏ float
    2 kiểu khác nhau vì vậy để thực hiện phép gán:
    pa=a; thì cần thực hiện ép kiểu cho a.

    Với phần thứ 2 bạn hỏi:
    Code:
    //các câu lệnh này ko có liên quan gì với các lệnh trên
    pa = (char*)(&a);
    
    pa = (char*)malloc(size)
    pa=(char*)(&a);
    tương tự như trên bạn không nói rõ khai báo kiểu của a nên không thể giải thích kĩ hơn.
    Dòng thứ 2 là cấp phát bộ nhớ dùng malloc kiểu trả về là void (không kiểu) vì vậy gán cho con trỏ kiểu char thì cần cùng ép kiểu (char *), bạn cần đọc kĩ hơn phần cấp phát động để thấy rõ điều này.

    Phần bạn hỏi về 8086 đó là lý thuyết hệ thống để học sử dụng ngắt, cái này mình không chắc nên mình không giám chỉ cho bạn, mình chỉ cho bạn một lời khuyên là học thật chắc phần con trỏ đi đã vì nó rất quan trọng, xong đâu đấy rồi hãy tiếp tục.

  3. #3
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi linhvlike Xem bài viết
    Em đang thắc mắc về vài câu lệnh như sau:

    1/ float *a, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?


    Còn các lệnh sau thì hiểu như thế nào:

    //các câu lệnh này ko có liên quan gì với các lệnh trên
    pa = (char*)(&a);

    pa = (char*)malloc(size)


    Em có cuốn sách của tác giả Phạm Văn Ất, trong sách có chương nói về bxl 8086, em mún hỏi bxl này và bxl Celeron(hay là các bxl 32bit hiện tại) khác nhau như thế nào?
    Thank
    Trích dẫn Nguyên bản được gửi bởi QuangHoang Xem bài viết
    Code:
    1/ float *a, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?
    Mình nghĩ bạn đã viết sai, đúng của nó là:
    Code:
    1/ float *pa, a[2][3];
    2/ pa = (float*)a;// ý nghĩa của lệnh này là gì?
    (float*) là ép kiểu cho biến con trỏ. Mình thấy trong sách đã giải thích phần này rất rõ.
    a được khai báo kiểu float[3]
    pa đươc khai báo kiểu con trỏ float
    2 kiểu khác nhau vì vậy để thực hiện phép gán:
    pa=a; thì cần thực hiện ép kiểu cho a.

    Với phần thứ 2 bạn hỏi:
    Code:
    //các câu lệnh này ko có liên quan gì với các lệnh trên
    pa = (char*)(&a);
    
    pa = (char*)malloc(size)
    pa=(char*)(&a);
    tương tự như trên bạn không nói rõ khai báo kiểu của a nên không thể giải thích kĩ hơn.
    Dòng thứ 2 là cấp phát bộ nhớ dùng malloc kiểu trả về là void (không kiểu) vì vậy gán cho con trỏ kiểu char thì cần cùng ép kiểu (char *), bạn cần đọc kĩ hơn phần cấp phát động để thấy rõ điều này.

    Phần bạn hỏi về 8086 đó là lý thuyết hệ thống để học sử dụng ngắt, cái này mình không chắc nên mình không giám chỉ cho bạn, mình chỉ cho bạn một lời khuyên là học thật chắc phần con trỏ đi đã vì nó rất quan trọng, xong đâu đấy rồi hãy tiếp tục.

    đầu tiên, bạn muốn hiểu vấn đề trên , ok ! đây là 1 vấn đề ko khó, chỉ hơi loằng ngoằng thôi.

    1. tôi hỏi bạn pa ở đây là gì ( biến hay con trỏ , con trỏ kiểu gì ? ) ? Nếu bạn chưa biết được nó là gì thì làm sao là hiểu câu lệnh đấy để làm gì ?

    2. tôi giải thích cho bạn như sau :

    PHP Code:
    float *aa[2][3]; 
    sai.
    sai vì 1 lúc khai báo 2 biến cùng định danh (tên)



    PHP Code:
    pa = (float*)a
    lệnh này có ý nghĩa như sau :
    Nếu pa và a là con trỏ thì :cho pa trỏ đến vùng nhớ mà a trỏ đến + ép kiểu vùng pa trỏ đến là float ;
    các trường hợp còn lại đều là sai ngữ pháp ;



    PHP Code:
    pa = (char*)(&a); 
    Nếu pa là con trỏ , a là biến vô hướng thì : cho con trỏ pa trỏ vào biến a, ép kiểu vùng nhớ pa trỏ đến là char.
    các trường hợp còn lại đều là sai ngữ pháp ;

    PHP Code:
    pa = (char*)malloc(n
    chú ý : n ở đây là 1 số cụ thể hoặc biến có giá trị nguyên dương cụ thể:
    ví dụ 1 , 2 ,3 ,8 ....
    Nếu pa là con trỏ nếu : cấp pháp n byte bộ nhớ cho con trỏ pa và ép kiểu vùng cấp pháp là kí tự ( với n=1 ) hoặc xâu kí tự ( n>1);
    các trường hợp còn lại đều là sai ngữ pháp ;


    QuangHoang khuyên đúng đấy. Bò chưa vững thì chạy cũng chỉ là tập tẹ
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  4. #4
    Ngày gia nhập
    05 2008
    Nơi ở
    tx tra vinh
    Bài viết
    9

    Bài viết đầu tiên đó có vài lỗi( tại bàn phím hết đát) thông cảm!.
    Cảm ơn các huynh đã dành thời gian trả lời.
    Các huynh giải thích cũng ko ngoài dự đoán của đệ, tại vì đệ hỏi ko kỹ, xin lỗi.
    Bi giờ hỏi lại.
    Code:
    1/ float *pa, a[2][3];
    2/ pa = (float*)a;
    Lệnh (float*) mặc dù đã tìm hết trong sách rồi mà sao ko thấy hướng dẫn phép ép kiểu có dạng (type*) .(quan trọng là dấu '*' á)
    Chỉ toàn là thấy:
    Code:
    1/ int a;
    2/ float b;
    3/ a = (int)b;
    Nên ko hiểu '*' là thế nào?
    Mọi lý thuyết đều màu xám, chỉ có cây đời mãi xanh tươi !!!

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    470

    Trích dẫn Nguyên bản được gửi bởi linhvlike Xem bài viết
    Bài viết đầu tiên đó có vài lỗi( tại bàn phím hết đát) thông cảm!.
    Cảm ơn các huynh đã dành thời gian trả lời.
    Các huynh giải thích cũng ko ngoài dự đoán của đệ, tại vì đệ hỏi ko kỹ, xin lỗi.
    Bi giờ hỏi lại.
    Code:
    1/ float *pa, a[2][3];
    2/ pa = (float*)a;
    Lệnh (float*) mặc dù đã tìm hết trong sách rồi mà sao ko thấy hướng dẫn phép ép kiểu có dạng (type*) .(quan trọng là dấu '*' á)
    Chỉ toàn là thấy:
    Code:
    1/ int a;
    2/ float b;
    3/ a = (int)b;
    Nên ko hiểu '*' là thế nào?
    Phép đổi kiểu tường minh (ép kiểu) trong C có dạng chung là (kiểu) tên biến. Trong trường hợp này kiểu là float*.

  6. #6
    Ngày gia nhập
    05 2008
    Nơi ở
    tx tra vinh
    Bài viết
    9

    Mặc định Hỏi về 1 số lệnh liên quan đến phép gán trng C

    Vậy thì kiểu float* là kiểu gì. Sao trong tài liệu ko nói đến.
    Mọi lý thuyết đều màu xám, chỉ có cây đời mãi xanh tươi !!!

  7. #7
    Ngày gia nhập
    05 2008
    Nơi ở
    tx tra vinh
    Bài viết
    9

    Lệnh pa = (float*)a dc tìm thấy trong đoạn mã "Nhập liệu vào mảng 2 chiều", như sau:
    Code:
    1/ float pa*, a[2][3];
    2/ pa = (float*)a;
    3/ for(int i=0; i<6; ++i)
    4/                scanf("%f", pa+i);
    Vì cấu trúc địa chỉ đc cấp phát cho a[2][3] là:
    1. a[0][0]
    2. a[0][1]
    3. a[0][2]
    4. a[1][0]
    .............
    Lại nhớ trong sách có nói:" Mảng 2 chiều là mảng 1 chiều của mảng". 'a' là địa chỉ của mảng a[2][] (ko biết phải nói sao). Ứng với:
    a là địa chỉ của phần tử a[0][0]
    a+1 là địa chỉ của phần tử a[1][0]
    a+2 là địa chỉ của phần tử KO CÓ. ^^

    Lệnh
    Code:
    pa = (float*)a;
    là gán địa chỉ của a( kiểu float[3]) cho pa. Vậy thì:
    pa là địa chỉ của phần tử a[0][0]
    pa+1 là địa chỉ của phần tử a[1][0]

    Chứ đâu phải là:
    pa là địa chỉ của phần tử a[0][0]
    pa+1 là địa chỉ của phần tử a[0][1]
    ............

    Cái phép ép kiểu có dấu '*' đó khó hiểu quá.
    Mọi lý thuyết đều màu xám, chỉ có cây đời mãi xanh tươi !!!

  8. #8
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Vậy thì kiểu float* là kiểu gì. Sao trong tài liệu ko nói đến.
    Là kiểu của con trỏ float
    VD: Khai báo biến:
    float *p;
    - Bạn nên hiểu và viết như này: float* p; khai báo biến con trỏ của kiểu float
    Tuy nhiên nếu khai báo như này thì không đc hiểu vậy không là sai đó:
    float* p,k;
    - Nên ghi như này: float *p,k; //p là biến con trỏ, còn k là biến kiểu số thực
    Mình viết hơi lằng nhằng nhưng để bạn hiểu bản chất còn cách viết thì cả 2 đều đúng.

  9. #9
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Lập luận trên nhầm tại đây:
    pa = (float*)a; là gán địa chỉ của a( kiểu float[3]) cho pa.
    a có kiểu float[3] cái này thì ok, còn (float*)a ép kiểu biến a để a trở thành kiểu float* rồi gán cho pa, hiểu vậy mới đúng.
    Sau khi nhập dữ liệu:
    a[2][3]={{1,2,3},{4,5,6}}
    - Bạn hình dung thứ tự lưu trên bộ nhớ là: {{1,2,3},{4,5,6}}
    - Sau khi ép kiểu trở thành: {1,2,3,4,5,6}
    - Gán cho con trỏ pa, nên pa sẽ trỏ đến địa chỉ ô nhớ chưa giá trị một, tăng pa lên nó sẽ trỏ tiến dần, phá vỡ mâu thuẫn của bạn.

  10. #10
    Ngày gia nhập
    05 2008
    Nơi ở
    tx tra vinh
    Bài viết
    9

    Hiểu.


    Cám ơn lắm lắm.
    Mọi lý thuyết đều màu xám, chỉ có cây đời mãi xanh tươi !!!

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

  1. Hướng dẫn lấy địa chỉ IP và các thông tin liên quan
    Gửi bởi tinhthanhiepsi9x trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 27-11-2012, 09:00 PM
  2. Lập trình C vấn đề liên quan đến đặc tả??
    Gửi bởi gyghung trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 18-06-2012, 10:41 PM
  3. ADO.NET Lấy Dữ Liệu Tự Trng Web Đưa Vào DataGirdView
    Gửi bởi lthict trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 15-04-2012, 12:11 AM
  4. Các hàm API liên quan đến thư mục ổ đĩa
    Gửi bởi foreverlove trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 01-04-2010, 04:12 AM
  5. Cho Hỏi về lõi trng C#
    Gửi bởi red_blue trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 14
    Bài viết cuối: 04-10-2008, 12:29 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