Указатели

1 view
Skip to first unread message

Daniel_10b

unread,
Jan 14, 2012, 1:21:07 PM1/14/12
to ТУЕС Програмно осигуряване 2011
char a = 10;
int *ptr;
ptr = (int *)&a;
printf("%d",*ptr);
Какво става като се каства от по-малък към по-голям тип?

TriEdgeAI

unread,
Jan 14, 2012, 2:24:42 PM1/14/12
to ТУЕС Програмно осигуряване 2011
*ptr ще ти даде байта на char-а, заедно със следващите 3 байта.

TriEdgeAI

unread,
Jan 14, 2012, 2:31:01 PM1/14/12
to ТУЕС Програмно осигуряване 2011
А те най-вероятно не са 0-ли, така че 10-ката ти ще се омаже тотално.

Daniel_10b

unread,
Jan 15, 2012, 12:43:24 PM1/15/12
to ТУЕС Програмно осигуряване 2011
#include<stdio.h>
#include<string.h>
int main(){
int a = 5,b = 10,c;
int *p = &a,*q = &b;
c = p - q;
printf("%d" , c);
return 0;
}
така и не разбрах защо това изплйоква 1, ако може някой да обясни.

Bojidar Dimitrov

unread,
Jan 15, 2012, 1:09:51 PM1/15/12
to ТУЕС Програмно осигуряване 2011
Това ,че ти изкарва 1 е чиста случайност. Тъй като
изваждаш 2 указателя, това ще ти даде разликите в
адресите (адресна аритметика на указатели). В случая
1 означава, че компилатора ти ти е дал 2 поредни адреса
от паметта.

Може би искаш да направиш:
c = *p - *q;

Това ще ти даде очаквания резултат, изваждайки
стойностите на клетките.

daniel georgiev

unread,
Jan 15, 2012, 1:56:05 PM1/15/12
to cprogrammi...@googlegroups.com
не точно това искам да направя...
обяснението е:
Difference of two same type of pointer is always one. 
но като погледна адресите разликата им е 4 не 1

2012/1/15 Bojidar Dimitrov <bozhidar...@gmail.com>

TriEdgeAI

unread,
Jan 15, 2012, 2:20:32 PM1/15/12
to ТУЕС Програмно осигуряване 2011
Аритметичните операции с указатели са свързани по някакъв начин с
размера на данните към който сочат. Примерно, ако имаш

short* p1 = 5;
p1++; //това се смята за една позиция напред, демек 2 байта
(приемайки, че short е 2 байта)
printf p1 //ще ти изведе 7, а не 6

int* p2 = 10;
p2++;
printf p2 //ще ти изведе 14, а не 11

В твоя случай адресите понеже са един до друг (през 4 байта
разстояние), означава, че са през 1 позиция разстояние, демек
разликата им е 1.

Ако искаш реалната разлика да получиш, мисля, че може да се направи
така:

int *p = &a,*q = &b;

c = (int)p - (int)q;
printf c //БАМ, четворка

Междувпрочем си фантазирам, може и да съм написал грешни неща :Д:Д:Д Е
ся ще проверя теорията ми

On Jan 15, 8:56 pm, daniel georgiev <daniel.georgie...@gmail.com>
wrote:


> не точно това искам да направя...
> обяснението е:
> Difference of two same type of pointer is always one.
> но като погледна адресите разликата им е 4 не 1
>

> 2012/1/15 Bojidar Dimitrov <bozhidar.dimit...@gmail.com>

TriEdgeAI

unread,
Jan 15, 2012, 2:23:41 PM1/15/12
to ТУЕС Програмно осигуряване 2011
ООООООооооооооооооооооо, бил съм прав. Баси якото.
Reply all
Reply to author
Forward
0 new messages