PDA

View Full Version : Hỏi về con trỏ



dungsivn
27-05-2005, 17:35
Cho mình hỏi , lệnh :
char * str1=new char và char *str=new char[size] ;
khác nhau ra sao ? Theo mình được biết ,str là 1 mảng các con trỏ kiểu char , còn str1 là 1 con trỏ kiểu char , thế thì tại sao :nhập (gets(str1)) str1="(3-2)*1-2" -> 1 vài lệnh cấp phát # -> in ra được str="(3-2" -> str1 thay đổi . Nếu dùng str -> OK . Mong các bạn giải thích giùm . Cảm ơn !

bao_luu
27-05-2005, 21:31
ban noi ro hon mot chut...tam thoi tui hieu y ban the nay...:str duoc cap phat chinh la mot chuoi...duoc cap phat voi "size" ki tu kieu char..con str1 chinh la mot con tro kieu char....ban noi ro hon phan sau di tui se tra loi cho ban

mtt333
27-05-2005, 22:04
Ông dungsivn copy nguyên đoạn chương trình của ông chứ nói vắn tắt kiểu như "(gets(str1)) str1="(3-2)*1-2" -> 1 vài lệnh cấp phát # -> in ra được str="(3-2" -> str1" thì chả ai hiểu cái gì cả. Mất công gì việc copy và paste đoạn chương trình vào đây cơ chứ

freegianghu
27-05-2005, 22:13
Cho mình hỏi , lệnh :
char * str1=new char và char *str=new char[size] ;
khác nhau ra sao ? Theo mình được biết ,str là 1 mảng các con trỏ kiểu char , còn str1 là 1 con trỏ kiểu char , thế thì tại sao :nhập (gets(str1)) str1="(3-2)*1-2" -> 1 vài lệnh cấp phát # -> in ra được str="(3-2" -> str1 thay đổi . Nếu dùng str -> OK . Mong các bạn giải thích giùm . Cảm ơn !

Trong khai báo trên: str1 trỏ đến mảng char có 1 phần từ (str1=new char[1])

dungsivn
31-05-2005, 08:51
Xin lỗi các bạn là mình không tải đoạn code lên được , mình đã thử 2 lần rồi nhưng không tải lên được (= copy ,paste ) ! Còn bây giờ cho mình giải thích lại : mình muốn biết sự khác nhau giữa str1=new char và str=new char[size] . Sau khi cấp phát ,str1 và str , mình cấp phát 1 vài con trỏ # ( không liên quan đến str và str1 ).Trước khi cấp phát , str1=str=(3-2)*1-2 , sau khi cấp phát , " str1=(3-2 " còn "str=(3-2)*1-2 ". Mình không hiểu tại sao str1 lại " mất mát nguyên vật liệu " như vậy.Mong hồi âm !

whitepenguin
01-06-2005, 11:58
Cho mình hỏi , lệnh :
char * str1=new char và char *str=new char[size] ;
khác nhau ra sao ? Theo mình được biết ,str là 1 mảng các con trỏ kiểu char , còn str1 là 1 con trỏ kiểu char , thế thì tại sao :nhập (gets(str1)) str1="(3-2)*1-2" -> 1 vài lệnh cấp phát # -> in ra được str="(3-2" -> str1 thay đổi . Nếu dùng str -> OK . Mong các bạn giải thích giùm . Cảm ơn !
str *** phải là mảng các con trỏ kiểu char ,mà là con trỏ tới mảng kiểu char ,ặc ặc nói lung tung
con cái str1 ="(3-2)*1-2" -->cái này mà working well tao chết liền
str1 trỏ đến "một" ô nhớ trong máy tính , có kiểu char(1 byte)
str1 chỉ có thể chứa tối đa 1 ký tự hiểu ko , str1 mà gán bằng nguyên 1 cái chuỗi như trên thì có thể gặp may thì được ,nhưng mà bình thường thì hay bị down system lắm, tại vì gán tầm bậy
để tao giảng cho mày hiểu :
char *str1=new char
biết cái này là gì ko str1 sẽ lưu địa chỉ của 1 ô nhớ nào đó trong bộ nhớ máy tính
do đó mún cho cái ô nhớ mà str1 chỉ tới bằng một giá trị nào đó thì làm như vầy *str1='a' ví dụ vậy
còn cái char *str=new char[8] ,ví dụ
thì str lưu giá trị địa chỉ của
một mảng ,cụ thề là str1 lưu địa chỉ của phần tử đầu tiên trong mảng
ví dụ cho coi
str[0]='a';
str[1]='i';
str[2]='c';
......
str[7]='h';

________________
str----> |a|i |c| | | | | h|
-------------------
mày bít str chứa gì ko ,str ko chứa chữ a ,mà str chưa cái địa chỉ của ô đầu tiên
và kích thước str là 16 bít đối với model small 32 bít đối với model large
còn str[0] hoặc str[1] hoặc ... str[7] chỉ có 1 byte thui (8bit)
hi vọng là tao ko nói khó hiẻu

mo dung phuc
04-06-2005, 08:42
trình bày vấn đề như ông này thì bác Hồ sống lại cũng tát cho lệch mặt
vì cái tội nói mà tao đếk hiểu

whitepenguin
04-06-2005, 16:07
mày dếk hiều là do mày ,tự tát mày đi ,mới không ra được

mo dung phuc
05-06-2005, 18:28
xin góp ý cho đồng chí 1 điều là đã hỏi thì không tốn công sức gì mà không hỏi đến nơi
đến chốn, chứ hỏi kiểu giật cục, són từng tý một thì chả ai hiểu đâu, mà người ta thấy
rõ ràng là chính ông cũng không thật sự đầu tư vào vấn đề ông hỏi -> thế thì ai muốn trả lời ông
thế nhé

netwalker
23-06-2005, 22:16
char* s = new char
tương đượng với

char* s = new char[1]

có điều cách ghi trên nhìn pro hơn :D

Ngô Huy Ánh
24-06-2005, 05:23
char* s = new char
tương đượng với

char* s = new char[1]

có điều cách ghi trên nhìn pro hơn :D
Hai cach ghi nay hoan toan khac nhau a
char* s = new char là khai bao mot con tro kieu char
char* s = new char[1] la khai bao mot mang con tro kieu char, nhung mang nay chi co mot phan tu. Điều này dẫn đến delete cũng khác nhau:
delete s và delete [] s;

khaplienhoa
27-06-2005, 14:26
Không phải đâu bác Ngô Huy Ánh ơi, hai cái đó hoàn toàn giống nhau. Chúng đều có chức năng cấp phát một vùng nhớ có kích thước sizeof (char) == 1 byte, rồi trả lại địa chỉ cho con trỏ s. Để giải phóng cái s thì dùng delete, delete [], hay free đều tốt cả.

delete có thể hiểu như là gọi ~destructor, sau đó gọi free. Tầng dưới của C/C++ do các trình biên dịch quản lý cùng với các thư viện chuẩn, đều quản lý vùng nhớ cấp phát bằng các hàm cấp phát, mỗi vùng cấp phát được quản lý bằng địa chỉ của byte nhớ đầu tiên của cả vùng, xem như là ID của vùng nhớ. Vì vậy khi free (head address) nó sẽ đảm bảo chỉ giải phóng đúng không gian cấp phát. Vì vậy bạn không phải lo giải phóng thừa ra hay không giải phóng hết vùng nhớ, miễn là compiler là hàng tốt.