Значение указателя C

avatar
141_MATRIX_141
8 апреля 2018 в 07:38
50
2
0

У меня есть один вопрос! Я думаю о значении указателя.

#include <stdio.h>

#define dd NULL
enum {ee=1} ff=ee+17;

int main()
{

float hh[]={10,4,(float)('b'-'d')};

static float *ii=dd;

hh[0]+=6/4;
ii=&hh[2]-1;
*ii=ii[0]+3;
ii[-1]=(*(hh+1))+2;
hh[2]=*(++ii)*2;
*ii=(hh[0]==4);
printf("%f",ii);

Почему значение указателя ii = 0? Это не должен быть номер ячейки памяти?

Источник
AnT
24 августа 2018 в 00:41
0

printf("%f",ii); — бессмысленный вызов функции. Поведение не определено.

Ответы (2)

avatar
Sébastien S.
8 апреля 2018 в 07:53
0
hh[0]+=6/4; /* hh[0] = 11.000000 */
ii=&hh[2]-1; /* *ii =  hh[2 - 1] = 4.000000 */
*ii=ii[0]+3; /* *ii = 4 + 3 = 7.000000 */
ii[-1]=(*(hh+1))+2; /* hh[0] = h[1] + 2 = 9.000000 */
hh[2]=*(++ii)*2; /* hh[2] = *ii = hh[2] * 2 = ((float)('b'-'d')) * 2 = -4.000000 */
*ii=(hh[0]==4); /* *ii = 0 */

*ii == 0; потому что чч[0] != 4

141_MATRIX_141
8 апреля 2018 в 07:55
0

Я знаю, что *ii == 0; потому что hh[0] != 4, но почему ii = 0?

Sébastien S.
8 апреля 2018 в 07:57
0

II != 0; Выведите его адрес следующим образом: printf("%u",(unsigned int)ii);

Sébastien S.
8 апреля 2018 в 08:04
0

Если бы значение указателя ii было 0, вы бы получили ошибку сегментации при попытке доступа к *ii; Итак, yes ii указывает не на 0, а на адрес;

141_MATRIX_141
8 апреля 2018 в 08:06
0

Большое спасибо за этот ответ!!

avatar
Joshua
24 августа 2018 в 00:37
2

Вы попытались напечатать указатель с помощью %f, который печатает двойные числа. Неверное сопоставление int-float в varargs — неясный путь к неопределенному поведению. Используйте %p для указателей в printf.