01/10/2018, 16:05

Cho em hỏi về con trỏ trong C

#include <stdio.h>

int main(){
	int x = 10; int y = 4;
	int *p = &x; //Gan con tro p voi dia chi cua bien x
	p--; // -- di thi se gan con tro p vao dia chi bien y
	printf("%d", *p);
}

Cho em hỏi tại sao khi nó in ra nó không in ra 4 (giá trị của y vậy ạ), em chưa hiểu em sai ở đâu.

rogp10 viết 18:16 ngày 01/10/2018

Cách tổ chức bộ nhớ sẽ khác nhau chẳng có lí do gì để y luôn nằm sau x cả.

Nguyen Kien viết 18:10 ngày 01/10/2018

Suy nghĩ khác với hành động vậy bạn ???
Suy nghĩ:

p = &y;

Hành động:

p--;
Aster-Dynos viết 18:13 ngày 01/10/2018

Cái kiểu *p, p-- chỉ làm được khi nào bạn biết mấy cái variables sẽ ở cạnh bên nhau trong memory thôi (như array chẳng hạng).
Còn bạn declared cái variable x and y này thì máy của bạn cũng sẽ lưu tụi nó lại trong memory, nhưng kế bên nhau hay không thì chỉ có mình nó biết thôi. Thường thì xy sẽ lưu ở 2 chỗ khác nhau. Nên bạn in ra garbage value là vậy.

name viết 18:09 ngày 01/10/2018
int x = 10; int y = 4;
int *p = &x; //Gan con tro p voi dia chi cua bien x
p--; // -- di thi se gan con tro p vao dia chi bien y
printf("%d", *p);

nếu bạn hiểu về cấu trúc stack mình sẽ giải thích như sau
int x = 10
thực chất là đưa 10 vào vị trí ESP - 4 (ESP là con trỏ của stack)
int y = 4 thực chất là đưa 4 vào vị trí ESP - 8 (ESP là con trỏ của stack)
(tại sao là -8 vì biến của sự khai báo là Int mà int là có độ lớn dữ liệu thực sự là 4 byte)
dĩ nhiên nếu int z= 1 chất là đưa 1 vào vị trí ESP - C (ESP là con trỏ của stack) (C=8+4byte tiếp theo)
thì p=p-2 () lúc này *p sẽ mang giá trị là 1
=> điều bot muốn nói là khi C biên dịch thanh mã máy ta dùng Assembly để đọc mã đấy thì sẽ tường minh tất cả vì câu hỏi có mụch đích hướng đến cội nguồn của sự thật nên mình tạm thời đề cập

giải quyết lỗi đó
*p = *p -1;

atlantica viết 18:19 ngày 01/10/2018

bạn nào giải thích giùm tại sao code như này lại ra đúng còn như post 1 của @GaConXYZ lại không ra ???

    int x = 10;
    int y = 4;
    int *p = &x;//Gan con tro p voi dia chi cua bien x
    p --; // -- di thi se gan con tro p vao dia chi bien y
    printf(" %d\n %d\n %d",&x,&y,*p);
Bài liên quan
0