30/09/2018, 19:14

Cách chuyển kiểu dữ liệu của giá trị trong một vị trí ô nhớ như thế nào?

ô nhớ giá trị 2 khi chuyển sang con trỏ int lại thành 0x08070605. Thx m.n.

Ỷ Thiên Bất Bại viết 21:14 ngày 30/09/2018

Mình chuyển giá trị 2 của con trỏ int sang hexa. Sao lại ra giá trị trong ô nhớ là 0x08070605 vậy m.n.

Vu Van Chung viết 21:30 ngày 30/09/2018

không hiểu ý bạn lắm, bạn có thể copy code mình chạy thử đc không? với chỗ mã quy cách in thì bạn phải để là %d chứ sao lại là %p nhỉ?

Ỷ Thiên Bất Bại viết 21:22 ngày 30/09/2018

#include <stdio.h>
#include <stdlib.h>

int main()
{
int n,i;
char *a;
char *p;
int *q;

a=(char*)malloc(100);
p=a;
q=a;
printf(“nhap so luong phan tu vao mang:”);
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf(“nhap phan tu thu %d:”,i+1);
scanf("%d",a+i);
}
printf("%p\n",(p+1));
printf("%p\n",
(q+1));
}
% đê in ra hexa bạn ạ. mình đang ko hiểu giá trị 2 của contro kiểu int lại ra mã hexa là 08070605.

Vu Van Chung viết 21:29 ngày 30/09/2018

vẫn không hiểu được ý bạn, bạn có thể miêu tả rõ hơn ko? mà mình chạy có lỗi chỗ ép kiểu q=a

Ỷ Thiên Bất Bại viết 21:15 ngày 30/09/2018

bên mình vẫn chạy bt mà.

Vu Van Chung viết 21:24 ngày 30/09/2018

Mình chưa hiểu rõ ý bạn nhưng địa chỉ con trỏ kiểu int theo mình biết là nó chiếm 4 byte? không biết bạn thắc mắc là thắc mắc chỗ nào?

Ỷ Thiên Bất Bại viết 21:22 ngày 30/09/2018

giá trị mình nhập ở ô nhớ thứ 2 ý. khi printf dạng hexa lại là 08070605.

Pham Van Hai viết 21:22 ngày 30/09/2018
  • Con trỏ q là kiểu int (thường là 4 bytes tùy thuộc vào compiler, OS, phần cứng), trong khi a (chứa 1 byte) là kiểu char, nên khi gán q = a thì có thể xảy ra chuyển kiểu từ char * sang int *.
  • Câu lệnh printf cuối cùng sẽ không phải là in phần tử thứ 2 của a (tức a+1), mà in ra toàn bộ nội dung phần tử 5, 6, 7, 8 của a (tức a+4, a+5, a+6, a+7). Bạn nhìn kỹ kết quả sẽ thấy.

PS: Con trỏ có kiểu dữ liệu khác nhau sẽ có “bước nhảy” khác nhau khi thực hiện phép cộng trừ trên nó với một số nguyên.
ví dụ: char *a - a+1 “bước nhảy” sẽ là địa chỉ của biến a + 1 byte.
int *b - b+1 “bước nhảy” sẽ là địa chỉ của biến b + 4 byte.

Bài liên quan
0