01/10/2018, 12:31
Con trỏ n++ và *n++
Mọi người ơi,
Em đang học phần con trỏ và em có thắc mắc hai cái này ạ?

#include <iostream>
using namespace std;
int main()
{
int giatri = 6;
int *contro = &giatri;
cout << "Dia chi ban dau: "<< contro << endl; // dia chi cua bien giatri
contro++; // dua den dia chi tiep theo cac nhau 4 bytes theo kieu du lieu
// *contro++; // dua den dia chi tiep theo
cout << contro << endl;
cout << *contro << endl;
system("pause");
return 0;
}
Kết quả:
Theo em hiểu thì với:
-
contro++
thì địa chỉ mới sẽ tăng thêm 4 ô nhớ (theo kiểu dữ liệu) =>0x6ffe48
- còn
*contro++
thì nó truy cập vào địa chỉ0x6ffe44
và trỏ vào ô kế tiếp0x6ffe45
.Nhưng chương trình nó lại ra kết quả nhau là0x6ffe48
Em không biết em hiểu thế đúng hay chưa??? Có sai gì ai giúp em với ạ??
Em cám ơn <3
Bài liên quan
cai p++ là trỏ p đến ô nhớ đứng sau, còn *p++ có thể là *(p++), có nghĩa là đầu tiên nó sẽ thực hiện bước p++, sau đó sẽ lấy giá trị tại ô nhớ đấy. p++ vẫn là 1 con trỏ, còn *p++ là 1 giá trị, * ko thay đổi gì p thì tất nhiêu bạn dùng cout sẽ ko khác gì nhau
Con trỏ đó phải là
char*
, vìsizeof(char) = 1
.Kết quả của chương trình này là:

Sau khi trỏ vào ô mới nó tạo ra một giá trị rác mới, lẽ ra sau câu lệnh
(*contro)++
nó sẽ tăng từ7339592
lên7339593
, sao lại là28670
hay câu lệnh này cũng lên ô mới rồi khởi tạo giá trị ạ ???Anh giúp em với
ơ sao, biến
giatri
làint
màcontro
lại char được ạ ???Em được biết con trỏ phải cùng kiểu với biến nó chỉ vào chứ ạ???
Đó là câu trả lời cho câu hỏi dạng “giả sử” của bạn.
Tại em cứ nghỉ là hai cái nó sẽ khác nhau về cách tăng địa chỉ.
Em cứ nghỉ nó sẽ tăng từ ô màu xanh
thứ nhất
lên ô thứ 2
chứ không phải là tăng từxanh
lênvàng
một lần 4 ô như trong hình ạ??ptr++ theo định nghĩa là phải trỏ vào ô nhớ tiếp theo sau ptr, mà ptr cộng thêm 1 byte cũng là nằm trong ô nhớ định bởi ptr vì 1 ô là 4 byte, vậy làm sao mà đúng
bạn nên đọc lại về các kiểu dữ liệu của biến và kích thước của từng kiểu dữ liệu
Em cám ơn ạ <3 Em sẽ nghiên cứu lại.