Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 34 kết quả

Đề tài: Sự khác nhau giữa *char và char[]?

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    78

    Mặc định Sự khác nhau giữa *char và char[]?

    - các member cho hỏi: giữa *char và char[] có khác nhau nhiều lắm ko?
    Theo tôi hiểu thì:
    + *char là con trỏ kiểu chuỗi.Nó trỏ đến phần tử đầu tiên of chuỗi.Kích thước ko xác định.
    + char[] là mảng các kí tự có kích thước cố định.

    ==>Vậy thì dùng *char lợi hơn dùng char[] chăng?nên dùng cái nào?

    + Có ai còn ý kiến hay một khía cạnh so sánh nào liên quan tới nó thì hướng dẫn cho tui zới.
    Thanks rất nhiều!!!
    No way, No success..

  2. #2
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Theo mình biết thì 2 cái là 1.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    *char và char[]
    char* này thì có, *char tui chưa thấy bao h !
    Còn cơ bản thì cả 2 điều như nhau, chẳng thằng nào safe cả, nhưng xài C-string thì chịu rùi, đó là tại sao C++ string release.

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

    *char này thì Dr cũng chưa thấy, chỉ thấy char* <var>(Kiểu con trỏ char)

    char* <var>: là một kiểu con trỏ, khi dùng cần phải cấp phát bộ nhớ cho nó. Có thể sử dụng trong đối số là một mảng ký tự.

    char[] chỉ có trong C# thôi, trong C/C++ nó phải là char var[]: Đây là khai báo một mảng các phần tử kiểu char, thường dùng trong việc khởi gán giá trị của mảng xác định nào đó, hoặc dùng trong đối số là mảng, ...

    Ví dụ:
    C Code:
    1. int My_function(char *arr, ...) //OK!
    2. {
    3.    //some line-code
    4. }
    5. char[] arr; //Error: Declaration incorrectly
    6. char arr[]; //Error: Size of 'arr' is unknown or zero
    7. char arr[]={4,5,9,7,8}; //OK!
    8. int My_function(char arr[], ...) //OK!
    9. {
    10.    //some line-code
    11. }

    Nói chung là tùy từng trường hợp mà sử dụng thôi, lợi hay không lợi thì khó mà nói được lắm.

    Ragards!
    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!

  5. #5
    Ngày gia nhập
    03 2008
    Bài viết
    78

    -Oh! rất là sorry các bạn nhé...Mình nhầm qua con trỏ hoài.

    -Ý mình là so sánh giữa char * và char var[] đó?
    No way, No success..

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Sự khác nhau giữa *char và char[]?

    C++ Code:
    1. #include <iostream>
    2.  
    3. int main()
    4. {
    5.     char type1[] = {'a', 'b', 'c', '\0'};
    6.     char *type2 = "abc";
    7.    
    8.     //type1 = "abcd"; type1 is const char*
    9.     type2 = "acde";
    10.  
    11.     std::cout << sizeof(type1) << '\n';
    12.     std::cout << sizeof(type2) << '\n';
    13.  
    14.     std::cout << strcmp(type1, type2) << '\n';
    15.     std::cout << type1 << '\n';
    16.     std::cout << type2 << '\n';
    17.  
    18. }
    Khác biệt duy nhất, type1 là con trỏ hằng, trong khi char* là con trỏ tới kiểu char.

    Và khai báo cho type1 là bắt buộc phải có kí tự null cho nó
    C++ Code:
    1. char type1[] = {'a', 'b', 'c', '\0'}
    cực hơn, viết nhiều hơn .

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

    Uh! Đúng rồi, có 3 kiểu như thế này (*char, char * và char[]) tuy có na ná giống nhau nhưng mỗi người mỗi vẽ.Ko nên coi thường.
    --Cám ơn các member rất nhiều
    No way, No success..

  8. #8
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1.  *char
    Nếu ghi thế này là con trỏ hàm không giống 2 thằng kia đâu cậu ạ !
    By the way, cái mãng trên cũng có thể khai báo như kiểu string literal :
    C++ Code:
    1. char arr[] = "abc";
    Kí tự null sẽ tự động đc insert vào sau cùng !
    Đã được chỉnh sửa lần cuối bởi rox_rook : 13-03-2008 lúc 12:19 PM.

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

    char* và char[] khác nhau khi máy tính thực hiện việc truy cập
    ví dụ bạn viết char myString[10];
    thì khi biên dịch , bộ biên dịch sẽ tính ngay được địa chỉ của my_string và thay nó = địa chỉ bắt đầu của mảng ( ví dụ 0xabcdef )
    Khi truy cập : myString[1] thì sẽ lấy ngay giá trị ở địa chỉ 0xabcdef+1

    Nhưng nếu viết char* pMyString;
    rồi gán : pMyString = myString;
    Khi truy cập : pMyString[1] thì đầu tiên , máy tính phải lấy giá trị của pMyString , sau đó lấy giá trị đó +1 rồi nhảy vào đó lấy giá trị cần tìm ra
    Note :Tại sao bộ biên dịch lại tính ngay được địa chỉ của 1 mảng - Do các hệ điều hành ngày nay điều sử dụng địa chỉ ảo , mỗi tiến trình đều có không gian địa chỉ riêng của nó và đều bắt đầu từ 0x0000000000

  10. #10
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Mình xin góp ý như sau :

    Sự khác nhau giữa char *s và char s[]

    Trước hết chúng ta biết rằng trong C++ thì chuỗi là 1 trường hợp riêng của mảng . Nói cụ thể , chuỗi chính là 1 mảng các ký tự ASCII . Bạn có thể viết :

    C++ Code:
    1. char s[]="abcd"

    Khi đó bạn có 1 mảng trên bộ nhớ với các phần tử s[0]='a' , s[1]='b' , s[2]='c' , s[3]='d' .

    Đó là cách hiểu thông thường , đúng với các mảng có kiểu khác ( int , float ... ). Thực chất trình biên dịch đối xử với chuỗi khác với các mảng có kiểu khác ( int , float ... ) . Khi bạn khai báo như trên , trước hết trình biên dịch sẽ cất chuỗi ký tự "abcd" vào một vùng nhớ dành riêng và tự động thêm vào cuối chuỗi ký tự kết thúc chuỗi s[4]='\0'. Sau đó trình biên dịch cấp phát bộ nhớ cho chuỗi s và sao chép các ký tự trong chuỗi "abcd" vào đấy .

    Vùng nhớ này được dành riêng để chứa các chuỗi ký tự của chương trình , nó gọi là bảng chuỗi ( string table ) . Bản chuỗi này tồn tại cả vào lúc biên dịch lẫn lúc chạy chương trình . Như vậy , với câu lệnh trên thì chuỗi "abcd" sẽ hiện diện ở cả 2 nơi trên bộ nhớ : một ở bảng chuỗi , một ở chuỗi s .

    Nếu bạn ko muốn lãng phí bộ nhớ như thế thì bạn có thể khai báo như sau:

    C++ Code:
    1. char *s="abcd"

    Sau khi chuỗi "abcd" được cất vào bảng chuỗi , con trỏ s của bạn sẽ trỏ đến đầu chuỗi "abcd" nằm trên bảng chuỗi .

    Như vậy , nếu bạn đã hiểu thì bạn có thể đoán được rằng nếu như ta khai báo theo cách s[] thì khi ta sửa chuỗi "abcd" thì chỉ có chuỗi "abcd" của vùng nhớ của chuỗi s bị sửa chữa . Còn trên string table không hề hấn gì .

    Ngược lại nếu ta khai báo theo cách *s và sửa chữa chuỗi "abcd" thì chính "abcd" trên string table sẽ bị thay đổi đấy .

    Khác nhau cơ bản là thế thôi .
    ttecak ?

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

  1. Hai khai báo (char *p=new char[20]) và (char *p=new char [20]) giống nhau hay là khác nhau?
    Gửi bởi huyleuit 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: 18-11-2011, 10:29 PM
  2. Tìm SV theo tên trong DSLK đơn, lỗi invalid conversion from `char' to `const char*'
    Gửi bởi dk411 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 02-11-2011, 01:55 PM
  3. khác nhau giữa char*=new char; và char*=new char [100];
    Gửi bởi virus93ttll trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 20
    Bài viết cuối: 14-05-2011, 10:20 PM
  4. Sự khác nhau giữa char s[][] và char **?
    Gửi bởi voanhkhach trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 11-05-2011, 10:19 AM
  5. Sự khác nhau giữa char s[][] và char *s[]
    Gửi bởi voanhkhach trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 11-05-2011, 10:15 AM

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