01/10/2018, 08:19

Thắc mắc về xâu kí tự và con trỏ trong C

Xin chào mọi người!
Mình có đoạn code như sau:

char xau[200];
char *p, *q;
printf("Nhap xau : ");
scanf("%[a-zA-Z]", xau);
p = (xau + strlen(xau) - 1); 
q = ((&xau) + strlen(xau) - 1); 

câu hỏi của mình là tại sao 2 con trỏ p và q lại có giá trị khác nhau? Nghĩa là 2 con trỏ này trỏ vào 2 vùng nhớ khác nhau?
Cảm ơn mọi người!

Tao Không Ngu. viết 10:28 ngày 01/10/2018

HI Lê Nhật Thanh.
Đúng rồi ban.

Lê Nhật Thanh viết 10:21 ngày 01/10/2018

khi mình in xau, &xau thì nó giống nhau mà? mình không hiểu sao qua phép gán cho con trỏ thì nó khác.

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

Dự là xauchar[] còn &xauchar[200].

Lấy Calculator bấm trừ là ra 1393 = 199*7. http://ideone.com/BFwHrM

Vậy có thể thấy a và &a giống số nhưng khác nhau về bản chất. Cái này ra trắc nghiệm hơi bị thốn.

Lê Nhật Thanh viết 10:29 ngày 01/10/2018

Bạn có thể giải thích rõ hơn một chút không ạ. Mình chưa hiểu lắm. xau, &xau khi mình in ra thì nó bằng nhau, tự nhiên gán qua 2 con trỏ thì khác nhau!

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

Nếu p là con trỏ thì có thể hiểu phép cộng con trỏ với số nguyên như sau:

p + i == i + p = p (con số) + sizeof(p[0]) * i

Bạn thử tính &p[4] xem sao.

Với a là mảng thì công thức tương tự. Hình dung ntn: Giả sử bạn có một mảng T x[M][200] vậy x có kiểu là T[][200]. Giờ bạn thử xem x[0] phải là kiểu gì rồi áp dụng ct trên.

Lien Phan viết 10:20 ngày 01/10/2018

Mình nhớ ko nhầm thì &xau là tham biến

Lê Nhật Thanh viết 10:32 ngày 01/10/2018

Ồ, Tks các bạn, tối về mình thử rồi

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

C không có reference bạn

Tran Xuan Son viết 10:21 ngày 01/10/2018

p = (xau + strlen(xau) - 1);
q = ((&xau) + strlen(xau) - 1);

Theo mình nghỉ xau là con trỏ tới phần tử đầu tiên của mảng -> xau + n sẽ nhảy n bước, vì đây là con trỏ tới char 1 byte nên step là n1 . (&xau) là địa chỉ của mảng xau[200] -> &xau + n sẽ nhảy n bước, đây là con trỏ tới mảng char[200] nên step sẽ là n200.

Bài liên quan
0