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!

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

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.

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.

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!

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.

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

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

C không có reference bạn :smiley:

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 :grin:. (&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.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?