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ếp 0x6ffe45 .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

Hieu Hoang viết 14:38 ngày 01/10/2018

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

rogp10 viết 14:36 ngày 01/10/2018

Con trỏ đó phải là char*, vì sizeof(char) = 1.

Vâng cám ơn ạ <3 Thế có khi nào contro vị tiến tới 1 ô nhớ như từ 0x6ffe44 lên 0x6ffe45 không ạ??

Phan Trọng Tính viết 14:47 ngày 01/10/2018
#include <iostream>
using namespace std;

int main()
{
	int giatri = 6;
	int *contro = &giatri;
	cout << "Dia chi ban dau: "<< contro << endl;	
        contro++; 
        cout << *contro << endl;
        (*contro)++;
        cout << *contro << endl;
        cout << contro << endl;
return 0;
}

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

Phan Trọng Tính viết 14:38 ngày 01/10/2018

ơ sao, biến giatriintcontro 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ứ ạ???

rogp10 viết 14:40 ngày 01/10/2018

Đó là câu trả lời cho câu hỏi dạng “giả sử” của bạn.

Phan Trọng Tính viết 14:41 ngày 01/10/2018

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ên vàng một lần 4 ô như trong hình ạ??

rogp10 viết 14:33 ngày 01/10/2018

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

Hieu Hoang viết 14:35 ngày 01/10/2018

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

Phan Trọng Tính viết 14:33 ngày 01/10/2018

Em cám ơn ạ <3 Em sẽ nghiên cứu lại.

Bài liên quan
0